【问题标题】:How can I modify this code? Error is coming out如何修改此代码?错误出来了
【发布时间】:2020-05-04 14:45:19
【问题描述】:

我正在使用理想的 SRAM 和 CPU 设计一些数据总线系统的代码。我想写内存mem[0] -> IR,读内存IR -> mem[1],最后写内存mem[1] -> DR。

但是我遇到了一些问题。 这是代码,我对制作输入、输出、reg、wire的端口感到非常困惑。我很难通过 1 个测试台使用 2 个 DUT。如何通过修改此代码来避免错误?

    module sram(addr,clk,din,dout,we);

    parameter addr_width = 12, word_depth = 4096, word_width = 16;

    input clk,we;
    input [addr_width-1:0] addr;
    input [word_width-1:0] din;
    output [word_width-1:0] dout;


    reg [word_width-1:0] mem [0:word_depth-1];
    reg [word_width-1:0] dout;

    always @(posedge clk) begin
        if(!we)
            mem[addr] <= din[word_width-1:0];
        end

    always @(posedge clk) begin
        #1 dout <= mem[addr];
     end

    endmodule






    module cpu(clk,load,reset,select,ir,dr,ac,ar,pc,addr,we);

input clk,reset;
input [1:0]select;
input [1:0]load;

output reg[15:0] ir,dr,ac;
output reg[11:0] ar,pc;

input we;
input [11:0] addr;

reg[15:0] din;
wire[15:0] dout;

sram sram(addr,clk,din,dout,we);

always @ (posedge clk or negedge reset) begin
    if(!reset) begin
        ar <= 12'b0;  ir <= 16'b0;  pc <= 12'b0;  dr <= 16'b0;  ac <= 16'b0;
    end

    if(select==2'b01 && load==2'b01 && we==1)
        ir[15:0] <= dout[15:0];
    else if(select==2'b01 && load==2'b10 && we==0)
        din[15:0] <= ir[15:0];
    else if(select==2'b10 && load==2'b01 && we==1)
        dr[15:0] <= dout[15:0];
    end

endmodule


module tb_cpu();
parameter addr_width = 12, word_depth = 4096, word_width = 16;

reg clk,reset,we;
reg [1:0]select;
reg [1:0]load;
reg [addr_width-1:0] addr;
wire [word_width-1:0] ir,dr,ac;
wire [word_width-5:0] ar,pc;
integer file_pointer;
integer file_pointer2;

cpu cpu(clk,load,reset,select,ir,dr,ac,ar,pc,addr,we);

always #5 clk = ~clk;

initial begin
    clk = 0; addr = 12'b0; we = 0; reset = 1;
    #2 reset = 0; #2 reset = 1;

    $readmemb("sram.dat", tb_cpu.cpu.sram.mem);

    file_pointer = $fopen("reg.dat");
    file_pointer2 = $fopen("memory.dat");

    #10 select = 2'b01; load = 2'b01; we = 1; addr = 12'b000000000000; //cycle 1
    #10 select = 2'b01; load = 2'b10; we = 0; addr = 12'b000000000001; //cycle 2
    #10 select = 2'b10; load = 2'b01; we = 1; addr = 12'b000000000001; //cycle 3

    $fdisplay(file_pointer, "AR = %b", tb_cpu.cpu.ar);
    $fdisplay(file_pointer, "IR = %b", tb_cpu.cpu.ir);
    $fdisplay(file_pointer, "PC = %b", tb_cpu.cpu.pc);
    $fdisplay(file_pointer, "DR = %b", tb_cpu.cpu.dr);
    $fdisplay(file_pointer, "AC = %b", tb_cpu.cpu.ac);

    $fdisplay(file_pointer2, "mem[0000 0000 0000] = %b",tb_cpu.cpu.sram.mem[000000000000]);
    $fdisplay(file_pointer2, "mem[0000 0000 0001] = %b",tb_cpu.cpu.sram.mem[000000000001]);
    $fdisplay(file_pointer2, "mem[0000 0000 0010] = %b",tb_cpu.cpu.sram.mem[000000000010]);

     $fclose(file_pointer);
     $fclose(file_pointer2);

    #10 $finish;
end    
endmodule

【问题讨论】:

    标签: verilog


    【解决方案1】:

    我在tb_cpu 模块中收到关于tb_cpu.sram 分层说明符的代码编译错误。你应该全部改变:

    tb_cpu.sram
    

    到:

    tb_cpu.cpu.sram
    

    例如,改变:

    $readmemb("sram.dat", tb_cpu.sram.mem);
    

    到:

    $readmemb("sram.dat", tb_cpu.cpu.sram.mem);
    

    修复这些编译错误后,我还会看到与addrwe 相关的编译警告。我认为您需要将addrwe 输入端口添加到cpu 模块,并正确连接。

    模块cpu:

    module cpu(clk,load,reset,select,ir,dr,ac,ar,pc,addr,we);
    
    parameter addr_width = 12, word_depth = 4096, word_width = 16;
    
    input we;
    input [addr_width-1:0] addr;
    

    模块tb_cpu:

    cpu cpu(clk,load,reset,select,ir,dr,ac,ar,pc,addr,we);
    

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 2018-05-05
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多