verilog - 在 Verilog 中编码 RAM 的更好方法

标签 verilog vlsi

哪种代码更适合编写RAM?

  1. 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
    
  2. 使用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
    

有什么建议吗?

最佳答案

这取决于您的要求。

  1. 这会记录您的内存输出。如果您将其综合到门,您将比情况 2 多 8 个触发器。这意味着您使用更多的面积。这也意味着您的输出相对于时钟的传播延迟将比情况 2 更小。此外,输出数据直到下一个时钟周期才可用。

  2. 您的输出数据将在写入时的同一时钟周期内可用,尽管相对于时钟的传播延迟更长。

您需要根据您的要求决定使用哪个。

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

关于verilog - 在 Verilog 中编码 RAM 的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7630797/

相关文章:

verilog - 移位寄存器 Verilog

random - LSFR 随机数计数器

比较数字排序然后得到中值

error-handling - 我写了一个verilog代码,但得到了不是常量或未知类型之类的错误

system-verilog - System Verilog always_latch 与 always_ff

verilog - 如何在 Verilog 中对数字进行符号扩展

verilog - 用于将 verilog 输出写入文本文件的测试台

macros - 如何从预处理器宏创建字符串

Verilog 'assign' 语句

verilog - 错误 : (vlog-2110) Illegal reference to net "code"