verilog中的参数化周期延迟数?

verilog中的参数化周期延迟数?,verilog,Verilog,我必须根据管道中的级数来延迟我设计的管道中的一些控制信号。这显然是非常直接的——在输入信号和输出信号之间放置N个触发器。我想知道是否有一种方法可以参数化N。如果我改变管道中的阶段数,我必须返回并添加/删除触发器,这有点烦人。我曾考虑编写一个脚本来读取某个地方的define并生成模块,但这似乎有些过头了。在这里使用genvar循环正确吗 您可以使用参数化移位寄存器来执行此操作。比如: module shift ( input clk, input data_in, output dat

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

您可以使用参数化移位寄存器来执行此操作。比如:

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
模块移位
(
输入时钟,
将数据_输入,
输出数据输出
);
参数深度=3;
reg[DEPTH-1:0]保持寄存器;
始终@(posedge clk)开始

这里是如何使用生成块和DFF模块创建参数化移位寄存器。它甚至可以在深度为0和深度为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
模块移位
(
输入时钟,
输入复位,
将数据_输入,
输出数据输出
);
参数深度=3;
线[深度:0]连接线;
分配数据输出=连接线[深度];
分配connect_wire[0]=数据_in;
genvar i;
生成

对于(i=1;i)这里是EDA操场上的工作代码和测试:是否可以将其推广到动态数据_宽度?(而不仅仅是单位DFF)genvar似乎很麻烦。是的,您可以使用另一个参数DATA\u WIDTH。dff模块需要支持它。对于shift模块,您可以使用多维数组进行连接
wire[DATA\u WIDTH-1:0]connect\u wire[DEPTH:0];