更好的编码Verilog中的RAM的方式

哪个代码写得更好?

>将data_out分配给always:

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

任何建议?

这取决于你的要求。

>这将注册您的内存输出。如果你合成这个门,你会有16个触发器比在情况2更多。这意味着你使用一个更多的区域。这也意味着与情况2相比,输出相对于时钟的传播延迟较小。此外,在下一个时钟周期之前,输出数据将不可用。
>您的输出数据将在与其写入的相同时钟周期内可用,尽管相对于时钟具有较长的传播延迟。

您需要根据您的要求来决定使用哪一种。

第三个选项是使用生成的RAM,这是一个硬宏。这应该具有与情况1和2相比的面积,功率和可能的时序优势。

代码日志版权声明:
翻译自:http://stackoverflow.com/questions/7630797/better-way-of-coding-a-ram-in-verilog

转载注明原文:更好的编码Verilog中的RAM的方式