在verilog中使用带参数的generate

时间:2018-01-30 19:50:44

标签: 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];
       end 
   else 
      begin
         always @(*)
            begin
               out[i] = /*in[i] &*/ 1'b0; // without 'in' sim scheduler shouts
            end
      end
endgenerate

问题:

  1. 你知道用这种“漏洞”实现reg向量的更好方法吗?
  2. 我必须在组合中添加in [i],因为它需要灵敏度列表中的某些内容,否则模拟中的调度程序将不会 执行代码行。 “没有下沉的驱动程序”错误。你有更好的解决方案吗?

1 个答案:

答案 0 :(得分:-1)

使用位向量来生成寄存器(或不是)很好。

您始终可以指定一个零,这使得寄存器在优化期间将消失:

for (i=0; i<4; i=i+1) begin : FF_GEN
      always @(posedge clk) 
         out[i] <= N[i] ? in[i] : 1'b0;
end      

可能有些工具不喜欢你使用(*)因为他们开始寻找右侧变量而失败。 在这种情况下,您可以使用“in”作为敏感度列表。

 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;

发布编辑:
在最短的形式中,我依靠综合工具来识别某些位的结果总是为零,从而优化寄存器。 这可以防止,但你必须专门添加合成指令以保持它们。