Verilog (2^n)x m单端口RAM的建模

Verilog (2^n)x m单端口RAM的建模,verilog,Verilog,我正在使用Verilog对一个(2^n)x m单端口ram进行建模。该ram有一个输入启用端口、输入读写端口(rw),当它为1时,我们将写入ram,当它为零时,我们将只读取、输入地址端口(addr)、输入输出数据端口和输入写入数据端口 以下是设计代码: module single_port_ram # ( parameter n=4,m=4) (rw,addr,data,enable); input rw,enable; inout [m-1:0]data; input [n-1:0

我正在使用Verilog对一个(2^n)x m单端口ram进行建模。该ram有一个输入启用端口、输入读写端口(rw),当它为1时,我们将写入ram,当它为零时,我们将只读取、输入地址端口(addr)、输入输出数据端口和输入写入数据端口

以下是设计代码:

module single_port_ram # ( parameter n=4,m=4) (rw,addr,data,enable);
  input rw,enable;
  inout [m-1:0]data;
  input [n-1:0] addr;
  reg [m-1:0] ram [(2**n)-1:0]; 
  reg [m-1:0]data_reg;
  assign data = (enable & !rw ) ? data_reg : {(m-1){1'bz}};
  
  always @ (*) begin
   
    if(enable) begin
      if(rw) 
        ram[addr]<=data;// wrtite to the ram address
        else
          data_reg <= ram[addr] ; // read from ram address
    end
  end
endmodule

问题是,当我们写入时,ram应该在其数据双向端口中输出z值,当我们读取时,应该在数据双向端口中输出所需的值。在我的代码中不是这样的。如果您对其进行模拟,您会发现,在写入数据时,数据端口将遵循write_数据端口的值。这个问题的原因是什么?我认为它在tb代码中。

在您的测试台上,您当前总是设置
enable=1
,这永远不允许您在数据上看到
z
。如果设置
enable=0
,您将在数据上看到
z
。例如:

  // read
  rw=0 ;  addr=1;  #10

  // read
  enable=0; rw=0 ;  addr=1;  #10

  $finish;
此外,
z
常量的位宽度也有错误。更改:

{(m-1){1'bz}}
致:

{(m-1){1'bz}}
{m{1'bz}}