0

SRAM メモリから取得したデータを処理する回路をシミュレートしようとすると、問題が発生します。まず、SRAM メモリがデータで満たされます。これは、最後のテストベンチを見ればわかりますが、格納されたデータはオートマトンによって処理されます。次に、特定の状況では、出力が別の SRAM メモリに保存されます。したがって、最初の SRAM メモリからの読み取りデータを表す rd_data_instructions が常に未定義であるため、シミュレートすると、回路は奇妙な動作をします。したがって、rd_data_instructions に依存する他のすべての信号も未定義です。コードはここに掲載されています。

PS: モジュール sram_1port_instructions および sram_1port_data は、書き込みイネーブル信号を備えたクロック SRAM として動作する必要があります。これにより、wr_en が High の場合、メモリは受信したデータ (wr_data) を格納し、wr_en が Low の場合、メモリはデータ (rd_data) を出力できます。モジュール ユーザーは、このモジュールがメモリの「書き込みアドレス ポインタ」をインクリメントするメカニズムを提供するため、SRAM 命令メモリへの書き込みでデータが格納されるアドレスを必要としないように、書き込みプロセスを容易にする「インターフェイス」を表します。さらに、このモジュールに対応するテストベンチを確認できます。次に、出力ストレージ用に作成された別のメモリの対応するモジュールと、読み取りプロセスを容易にするように設計されたモジュールを確認できます (つまり、前の状況に似たものですが、書くプロセスを容易にする代わりに、読むことを容易にします)。最後になりましたが、デジタルシステムを作成するために以前のすべてのモジュールを相互接続することになっているウィッシュボーンモジュールを区別することができます. その結果、オートマトンは SRAM 命令メモリからデータを取得し、別のメモリに格納されているデータを出力します。最後に、結果を SRAM データ メモリから読み取ることができます。システムをシミュレートしようとすると問題が発生します。これは、rd_data_instructions など、SRAM 命令メモリから以前に格納された値を表示する必要があるいくつかの信号を読み取ろうとするときに問題が発生するためです。オートマトンなど。ウィッシュボーン モジュール内で、「開始」というラベルの付いた特別な信号を使用しました。これにより、SRAM メモリが読み取りプロセス用に準備されるように、書き込みイネーブルが 0 に設定されます。この特別な信号は、メモリからの入力データをオートマトンに「供給する」ことによって、実際にオートマトンをトリガーします。

//wishbone module
module wishbone(
    input clk,rst,start,
    output reg [2:0]in,
    output reg wr_en_instructions,wr_en_display,
    input [2:0] wr_data_instructions,//created for usr, in order to make possible to write data
    output reg [3:0] wr_data_display,
    output [2:0] rd_data_instructions,
    output [3:0] rd_data_display,//created for user, in order to make possible the display
    output [12:0]o
);

reg [15:0] pointer_instructions,pointer_display;

initial wr_en_instructions = 1'b1;

control_unit i0(.clk(clk),.rst(rst),.in(in),.o(o));
user i1(.clk(clk),.wr_en(wr_en),.address_in(pointer_instructions),.wr_data(wr_data_instructions),.rd_data(rd_data_instructions));
display i2(.clk(clk),.wr_en(wr_en_display),.address_in(pointer_display),.wr_data(wr_data_display),.rd_data(rd_data_display));
integer i = 0;
always @ * begin
    wr_en_display = ~wr_en_instructions;
end
always @(posedge clk) begin
    if(start) begin
        pointer_instructions <= 16'b0;
        pointer_display <= 16'b0;
        wr_en_instructions <= 1'b0;
    end
    else begin
        $display(rd_data_instructions);
        if(!wr_en_instructions) begin
            if(rd_data_instructions == 3'b1xx) begin
                wr_en_instructions <= 1'b1;//???
            end
            else if(rd_data_instructions == 3'b010) begin
                in <= rd_data_instructions;
                wr_data_display <= o;
                pointer_instructions <= pointer_instructions + 1;
                pointer_display <= pointer_display + 1;
            end
            else begin
                in <= rd_data_instructions;
                pointer_instructions <= pointer_instructions + 1;
            end
        end
        else begin
            i = i + 1;
        end
    end
end

endmodule

//testbench for top module
module wishbone_tb(
    output reg clk,rst,start,
    output [2:0]in,
    output wr_en_instructions,wr_en_display,
    output reg [2:0] wr_data_instructions,//created for usr, in order to make possible to write data
    output [3:0] wr_data_display,
    output [2:0] rd_data_instructions,
    output [3:0] rd_data_display,//created for user, in order to make possible the display
    output [12:0]o
);

wishbone cut(
    .clk(clk),.rst(rst),.start(start),
    .in(in),
    .wr_en_instructions(wr_en_instructions),.wr_en_display(wr_en_display),
    .wr_data_instructions(wr_data_instructions),
    .wr_data_display(wr_data_display),
    .rd_data_instructions(rd_data_instructions),
    .rd_data_display(rd_data_display),
    .o(o)
);

initial $dumpvars(0,wishbone_tb);

initial begin
    clk = 1'd1;
    repeat (600000)
    #100 clk = ~clk;
end

initial begin
    rst = 1'b1;
    #400 rst = 1'b0;
end

initial begin
    start = 1'b0;
    #13000400 start = 1'b1;
    #400 start = 1'b0;
end

initial begin
    wr_data_instructions = 3'd1;
    #3000400 wr_data_instructions = 3'd2;
    #1000000 wr_data_instructions = 3'd1;
    #3000000 wr_data_instructions = 3'd0;
    #2000000 wr_data_instructions = 3'd3;
    #1000000 wr_data_instructions = 3'd1;
    #3000000 wr_data_instructions = 3'd4;//halt
end

endmodule
4

0 に答える 0