在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;