【问题标题】:Inferring a single port RAM in Verilog在 Verilog 中推断单端口 RAM
【发布时间】:2017-07-15 06:22:47
【问题描述】:

我正在尝试制作一个 32x4(32 字,4 位)单端口 RAM 块。这是我的 Verilog 代码:

module RAM_array (input clk, wren, input [4:0] address,
                        input [3:0] data, output reg [3:0] q);

    reg [3:0] mem [31:0]; // a 4 bit wide 32 word RAM block.

    always @(posedge clk) begin
            if (wren)
                mem[address] <= data;
            q <= mem[address];
    end
endmodule

由于我在 DE-1-SoC 上使用 Altera 的 Cyclone V 芯片,我的代码基于他们的指南:http://quartushelp.altera.com/14.1/mergedProjects/hdl/vlog/vlog_pro_ram_inferred.htm

问题:每当我向块中的地址写入值时,我都必须等待一个额外的时钟周期才能将其写入。为什么会这样?

【问题讨论】:

  • 你的意思是“等待一个额外的时钟周期让它被写入”还是你的意思是“等待一个额外的时钟周期让q 输出改变”?鉴于您编写代码的方式,输出 q 需要 2 个时钟周期才能更改。
  • 您能否详细说明此处插入了额外的延迟周期是什么意思?如果您希望 q 在下一个循环中反映新值,请尝试阻塞分配。至少 Verilog 不是我的强项,但如果合成​​器决定将逻辑映射到与代码本身具有不同语义的块,我会感到惊讶。
  • 因为你在代码中使用了'non-blocking'赋值,所以q总是会得到mem[address]的旧值。所以,如果数据改变了,比如说'1'并且mem[address]之前是'0',verilog会将'1'分配给'mem'但是在它分配'0'给q之后。因此,您需要下一个时钟周期将值传播到“q”。
  • 啊,我现在明白了。如果我希望 q 的值改变下一个时钟周期,那么使用阻塞分配是实现此目的的唯一方法吗?不是按顺序使用阻塞分配总是会阻塞糟糕的风格吗?或者这是否是指南的一个例外(我很确定必须有一种方法来改进我的设计,而不是使用阻塞语句......)
  • 是的,在 flop 块的 输出 上使用阻塞是 bad。不过,您可以在内部温度上使用它。但是你现在问的是一个不同的问题。因此,您有一个问题:它应该如何在您的设计中发挥作用?

标签: verilog fpga intel-fpga


【解决方案1】:

我猜您在写入后尝试读取一个时钟周期时会看到“额外的时钟周期”,但仍会获得旧值。 发生这种情况是因为您在写入内存时使用了非阻塞分配,以及当您驱动输出 q 时。 因此,写入内存需要一个时钟周期,读取内存需要一个时钟周期。总共是两个周期。

如果您想减少内存延迟,请使用并发语句并“分配”输出 q。 这将实现从 mem 到输出 q 的简单连线:

module RAM_array (input clk, wren, input [4:0] address,
                    input [3:0] data, output [3:0] q);

    reg [3:0] mem [31:0]; // a 4 bit wide 32 word RAM block.

    always @(posedge clk) 
            if (wren)
                mem[address] <= data;

    assign q = mem[address];

endmodule

合成器应选择使用 FF 而不是 SRAM 块来实现此代码(这正是 FF 的行为 --> 零周期读取延迟,1 周期写入延迟)。 这没关系,不应该影响您的合成,因为它是一个非常小的数组。

【讨论】:

  • 谢谢!因此,这意味着如果我有一个尺寸明显更大的 SRAM 块,如果我需要减少延迟,我需要按照建议在 read-during-write 行为上使用某种“新数据”与“旧数据”由普利蒙?因为使用 32k 触发器而不是 sram 块并不是一个好主意...
  • 并非所有 FPGA 器件都支持这种带有 SRAM 块的存储器。另外,请注意,这种 SRAM 可以具有零写入延迟 - 当它是相同的地址时,从写入到读取存在旁路。一般来说,对于 32Kb 的大内存,我不会推荐它,除非时间对你来说不是问题。对于您所描述的场景,IMO 的正确做法是使用具有延迟的原始 SRAM,并修改与其交互的 RTL 以预期延迟。但同样,这完全取决于需求和资源
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多