在verilog中使用带参数的generate
我正在尝试使用向量参数实现触发器:在verilog中使用带参数的generate,verilog,Verilog,我正在尝试使用向量参数实现触发器: 如果N[i]=1,代码将实现物理触发器, 如果N[i]=0,代码将不会实现物理触发器 parameter N= 4'b0101; reg [3:0] out ; genvar i; generate for (i=0; i<4; i=i+1) begin : FF_GEN if (N[i]) begin always @(posedge clk) out[i] <= in[i
如果N[i]=1,代码将实现物理触发器,
如果N[i]=0,代码将不会实现物理触发器
parameter N= 4'b0101;
reg [3:0] out ;
genvar i;
generate
for (i=0; i<4; i=i+1) begin : FF_GEN
if (N[i])
begin
always @(posedge clk)
out[i] <= in[i];
end
else
begin
always @(*)
begin
out[i] = /*in[i] &*/ 1'b0; // without 'in' sim scheduler shouts
end
end
endgenerate
参数N=4'b0101;
注册[3:0]输出;
genvar i;
生成
对于(i=0;i,使用位向量生成寄存器(或不生成寄存器)是可以的
您始终可以指定一个零,使寄存器在优化过程中消失:
for (i=0; i<4; i=i+1) begin : FF_GEN
always @(posedge clk)
out[i] <= N[i] ? in[i] : 1'b0;
end
用于(i=0;i你误读了这个问题。在你的情况下,它会对每次迭代执行失败。我认为他依靠优化器识别常数并删除FF。这取决于设置和合成工具是否真的会,所以我认为OPs代码是最好的确定方法。@oldfart我使用了你最短的方法,并依靠synth删除F.F.,如Unn所述。谢谢大家!正如Unn所说:FFs将被优化掉。如果你想防止并保留它们,你必须付出大量的努力。这就像普通编译器中的不断折叠。如果要求在触发器和非触发器之间交替,你的方法是很好的。只需计算输入/输出所有情况下的TPUT。
for (i=0; i<4; i=i+1) begin : FF_GEN
if (N[i])
always @(posedge clk)
out[i] <= in[i];
else
always @(in) // or ( * ) but that might not always work
out[i] <= 1'b0;
end
always @(posedge clk)
out <= in & N;