哪种代码更适合编写RAM?
在
always
block 内分配data_out
:module memory( output reg [7:0] data_out, input [7:0] address, input [7:0] data_in, input write_enable, input clk ); reg [7:0] memory [0:255]; always @(posedge clk) begin if (write_enable) begin memory[address] <= data_in; end data_out <= memory[address]; end endmodule
使用
assign
语句分配data_out
:module memory( output [7:0] data_out, input [7:0] address, input [7:0] data_in, input write_enable, input clk ); reg [7:0] memory [0:255]; always @(posedge clk) begin if (write_enable) begin memory[address] <= data_in; end end assign data_out = memory[address]; endmodule
有什么建议吗?
最佳答案
这取决于您的要求。
这会记录您的内存输出。如果您将其综合到门,您将比情况 2 多 8 个触发器。这意味着您使用更多的面积。这也意味着您的输出相对于时钟的传播延迟将比情况 2 更小。此外,输出数据直到下一个时钟周期才可用。
您的输出数据将在写入时的同一时钟周期内可用,尽管相对于时钟的传播延迟更长。
您需要根据您的要求决定使用哪个。
第三种选择是使用生成的 RAM,它是一个硬宏。与情况 1 和 2 相比,这应该具有面积、功率和可能的时序优势。
关于verilog - 在 Verilog 中编码 RAM 的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7630797/