【问题标题】:Behavioral model for single port RAM error on bidirectional inout port双向输入端口上单端口 RAM 错误的行为模型
【发布时间】:2020-07-07 11:50:51
【问题描述】:

假设我们有一个单端口 2^n*m 位 RAM。其描述如下。它有一个地址端口、启用端口、一个 rw(读写)端口和一个双向数据端口,您可以通过它读取和写入数据。我的问题是到目前为止我无法使用我的代码通过此端口进行写入:

module dual_port_ram # ( parameter n=4,m=4) (rw,addr,data,enable,clk);
  input rw,enable,clk;
  inout reg [m-1:0]data;
  input [n-1:0] addr;
  reg [m-1:0] ram [(2^n)-1:0]; 
  
  always @ (posedge clk) begin
    if(enable) begin
      if(rw) 
        ram[addr]=data;// wrtite
        else
          data=ram[addr];// read
    end
  end
endmodule

这是错误:

# SLP: Fatal Error: design.sv (3): Inout port 'data' of 'dual_port_ram' must be a net.

【问题讨论】:

  • 注意:2^n 的意思是“2 xor n”,而不是“2 的 n 次方”。所以,2^4 是 6。你可能打算使用 2**n

标签: verilog


【解决方案1】:

inout 端口很棘手。通常,您需要创建一个单独的reg 信号来分配给它,例如data_reg

module dual_port_ram # ( parameter n=4,m=4) (rw,addr,data,enable,clk);
  input rw,enable,clk;
  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'bz}};

  always @ (posedge clk) begin
    if(enable) begin
      if(rw) 
            ram[addr]=data;// write
        else
            data_reg=ram[addr];// read
    end
  end
endmodule

【讨论】:

    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多