【问题标题】:Parameterized number of cycle delays in verilog?verilog中的参数化周期延迟数?
【发布时间】:2013-08-09 18:35:37
【问题描述】:

我必须根据流水线中的级数来延迟我设计的流水线中的一些控制信号。这显然非常简单——只需在输入信号和输出信号之间放置 N 个触发器。我想知道是否有一种方法可以参数化 N。如果我改变了管道中的阶段数,我必须返回并添加/删除触发器,这有点烦人。我想过只写一个脚本来读取某个地方的定义并生成模块,但这似乎有点矫枉过正。 genvar循环是去这里的正确方法吗?

【问题讨论】:

    标签: verilog


    【解决方案1】:

    您可以使用参数化移位寄存器来执行此操作。类似的东西:

    module shift
    (
      input clk,
      input data_in,
      output data_out
    );
    
    parameter DEPTH = 3;
    reg [DEPTH-1:0] holding_register;
    
    always @ (posedge clk) begin
      holding_register <= {holding_register[DEPTH-2:0], data_in};
    end
    
    assign data_out = holding_register[DEPTH-1];
    
    endmodule
    

    另一种选择是使用生成语句来创建基本相同的效果。

    【讨论】:

    【解决方案2】:

    以下是使用生成块和 DFF 模块创建参数化移位寄存器的方法。它甚至适用于 DEPTH=0 和 DEPTH=1

    module shift
    (
      input clk,
      input reset,
      input data_in,
      output data_out
    );
    
    parameter DEPTH = 3;
    wire [DEPTH:0] connect_wire;
    
    assign data_out = connect_wire[DEPTH];
    assign connect_wire[0] = data_in;
    
    genvar i;
    generate
       for (i=1; i <= DEPTH; i=i+1) begin
          dff DFF(clk, reset,
            connect_wire[i-1], connect_wire[i]);
       end
    endgenerate
    
    endmodule
    

    在 EDA Playground 上进行测试的完整工作代码:http://www.edaplayground.com/s/4/50

    【讨论】:

    • 是否也可以将其推广到动态 DATA_WIDTH ? (而不仅仅是一位 DFF)genvar 看起来很麻烦。
    • 是的,您可以使用另一个参数 DATA_WIDTH。 dff 模块需要支持它。对于 shift 模块,您可以使用多维数组进行连接wire [DATA_WIDTH-1:0] connect_wire [DEPTH:0];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2017-02-23
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多