1

在verilog中,只有这行代码它显示模拟输出

1)

#( parameter width=1, length=16 )
       (* ram_style = "block" *)
          reg [(width)-1:0] mem[(1<<length)-1:0];

2)但对于下面的行,它没有显示模拟输出

  #( parameter width=8, length=16 )
   (* ram_style = "block" *)
         reg [(2*width)-1:0] mem[(1<<length)-1:0];

解释为什么第二组代码没有显示模拟结果?实际上我想存储8位最小65535滤波器系数..我想读写..请指导我...

4

1 回答 1

1

RAM 的模型可能看起来像下面的代码,要写入它只是对 wr_addr、wr_data 和 wr_en 进行排序。

module ram #(
  parameter DATA_W = 8,
  parameter DATA_D = 256
) (
  input                      clk,
  input                     rst_an,
  input  [0:$clog2(DATA_D)] rd_addr,
  input  [0:$clog2(DATA_D)] wr_addr,
  input  [0:DATA_W-1]       wr_data,
  input                     wr_en,
  output [0:DATA_W-1]       rd_data
);

reg [0:DATA_W-1] ram_data [0:DATA_D-1];

//READ
always @* begin
  rd_data = ram_data[rd_addr];
end

//WRITE
always @(posedge clk, negedge rst_an) begin
  if (~rst_an) begin
    for(int i = 0; i<DATA_D ; i++) begin
      ram_data[i]     <= 'b0 ;
    end 
  end
  else begin
    if (wr_en) begin
      ram_data[wr_addr] <= wr_data ;
    end
  end
end

for(int i = 0; i<DATA_D ; i++)是系统verilog语法。

对于普通的verilog声明integer i,然后将for循环替换为:

for(i = 0; i<DATA_D ; i=1+1)

clog2 :用于获取给定深度所需的地址宽度。

如果你想要 4 的深度,你需要 2 位来解决它。16的深度,4位寻址,即

log2( 4) => 2
log2(16) => 4 

如果你使用非二的幂,你想四舍五入或天花板

log2(5)  => 2.32192809489
clog2(5) => 3

因此 clog2 对于从 RAM 的深度获得所需的寻址宽度非常有用。

于 2015-12-29T11:19:54.060 回答