【发布时间】:2013-08-09 18:35:37
【问题描述】:
我必须根据流水线中的级数来延迟我设计的流水线中的一些控制信号。这显然非常简单——只需在输入信号和输出信号之间放置 N 个触发器。我想知道是否有一种方法可以参数化 N。如果我改变了管道中的阶段数,我必须返回并添加/删除触发器,这有点烦人。我想过只写一个脚本来读取某个地方的定义并生成模块,但这似乎有点矫枉过正。 genvar循环是去这里的正确方法吗?
【问题讨论】:
标签: verilog
我必须根据流水线中的级数来延迟我设计的流水线中的一些控制信号。这显然非常简单——只需在输入信号和输出信号之间放置 N 个触发器。我想知道是否有一种方法可以参数化 N。如果我改变了管道中的阶段数,我必须返回并添加/删除触发器,这有点烦人。我想过只写一个脚本来读取某个地方的定义并生成模块,但这似乎有点矫枉过正。 genvar循环是去这里的正确方法吗?
【问题讨论】:
标签: verilog
您可以使用参数化移位寄存器来执行此操作。类似的东西:
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
另一种选择是使用生成语句来创建基本相同的效果。
【讨论】:
以下是使用生成块和 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
【讨论】:
wire [DATA_WIDTH-1:0] connect_wire [DEPTH:0];