【问题标题】:Stuck at synthesis for RAM block-> giving warning as Sourceless signal卡在 RAM 块的合成中-> 作为无源信号发出警告
【发布时间】:2015-12-30 08:31:30
【问题描述】:

下面是 RAM 模块,我希望在其中读取系数值。

entermodule RAM_LP#( parameter width=8, length=16 )

(output reg [width*width-1:0]data_out,

input [width-1:0] address,

input clk,we);

// let the tools infer the right number of BRAMs

(* ram_style = "block" *)

(* synthesis, ram_block *)

reg [15:0] mem [0:65535];

parameter load_file = "generated/LP_coefficients.txt";

initial  
    begin
        $readmemh (load_file, mem);

end

 always @(posedge clk) begin

if (we) 

     data_out <= mem[address];
   end


endmodule

给出警告并停留在这一点 ->

WARNING:Xst:653 - 信号 已使用但从未分配。此无源信号将自动连接到值 0000000000000000。

请指导我如何解决这个问题。

【问题讨论】:

  • 将 data_out 声明为 [2*width-1:0]data_out 而不是 [width*width-1:0]data_out,因为您的 mem 是 16 位宽度。地址为[length-1:0] address
  • 请发布完整的错误信息,它应该包括信号名称。你模块的参数是没用的,只要内存是固定大小的。

标签: verilog ram


【解决方案1】:

您永远不会在 RAM 中写入任何新内容,因此综合工具会对此发出警告并将此 RAM 视为 ROM。

这部分代码:

always @(posedge clk) begin
  if (we) 
     data_out <= mem[address];
end

当我们为1时读取当前内存地址。假设你想在我们为1时写入内存,所以应该是这样的:

always @(posedge clk) begin
  if (we) 
     mem[address] <= data_in;
  data_out <= mem[address];
end

作为data_in 一个输入端口,其中包含您要写入内存的数据。注意写操作后的时钟周期,data_out 仍然会有旧的内存内容。要在执行写入时更新 data_out,请执行以下操作:

always @(posedge clk) begin
  if (we) begin
     mem[address] <= data_in;
     data_out <= data_in;
  end
  else
    data_out <= mem[address];
end

您的模块当前没有data_in 端口,因此它描述的是ROM,而不是RAM,并且在ROM 中,此警告是无害的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2021-02-12
    相关资源
    最近更新 更多