【问题标题】:genvar system verilog for numbered signals and passed in string in instance name用于编号信号的 genvar 系统 verilog 并在实例名称中传入字符串
【发布时间】:2017-06-13 21:33:48
【问题描述】:

首先,我想在系统 verilog 中使用 genvar 实例化一堆通用缓冲区,其中每个实例基本上包含索引的值,以使它们具有不同的名称,以便我可以将它们绑定到 8 位总线,一个每比特缓冲。

代码可能在语法上不正确,但这是我想要做的:

genvar i;
generate
  for (i=0; i<7; i=i+1)
  begin 
   IBUFDS IBUFDS_[actual_value_of_i_here]_clk
    (
     .I (input1_reg[fire_actual_value_of_i_here_starter]),      
    .IB (input1b_reg[actual_value_of_i_here_starter]),
    .O  (output_reg[actual_value_of_i_here_starter])
     );
 end
endgenerate

我希望最终结果看起来像这样,从 0 到 7。

IBUFDS IBUFDS_[0]_clk
    (
     .I (input1_reg[fire_0_starter]),       
    .IB (input1b_reg[fire_0_starter),
    .O  (output_reg[fire_0_starter)
     );


IBUFDS IBUFDS_[1]_clk
    (
     .I (input1_reg[fire_1_starter]),       
    .IB (input1b_reg[fire_1_starter]),
    .O  (output_reg[fire_1_starter])
     );

我不知道如何传入索引 i 以便它在实例名称中使用以及插入到它所连接的信号中。

第二: 我还想做一些更高级的事情,在实例名称中,我有一些包含 8 个值的数组,例如 farm_array[chicken, rooster, cow... etc],我提取字符串值并将它们输入到实例名称中,所以例如,最终结果如下所示:

IBUFDS IBUFDS_chicken_0_clk
    (
     .I (input1_reg[fire_0_starter]),       
    .IB (input1b_reg[fire_0_starter),
     .O  (output_reg[fire_0_starter)
 );



IBUFDS IBUFDS_rooster_1_clk
    (
      .I (input1_reg[fire_1_starter]),      
      .IB (input1b_reg[fire_1_starter]),
      .O  (output_reg[fire_1_starter])
     );

如何将字符串值从该数组传递到 genvar?

【问题讨论】:

    标签: loops system-verilog


    【解决方案1】:

    首先:您不需要字符串。 genvar可以让你接近你想要的

    genvar i;
    generate
      for (i=0; i<7; i=i+1)
      begin : IBUFDS_
       IBUFDS clk
        (
         .I (input1_reg[i]),       
        .IB (input1b_reg[i]),
        .O  (output_reg[i])
         );
     end
    endgenerate
    

    这生成的代码看起来就像你实例化如下

    IBUFDS IBUFDS_[0].clk
        (
         .I (input1_reg[0]),        
        .IB (input1b_reg[0]),
        .O  (output_reg[0])
         );
    
    
    IBUFDS IBUFDS_[1].clk
        (
         .I (input1_reg[1]),        
        .IB (input1b_reg[1]),
        .O  (output_reg[1])
         );
    

    请注意,[0] 和 [1] 嵌入在符号实例名称中,您不能像在计算为 0 和 1 的数组索引中那样使用表达式。

    第二:没有办法用字符串构建实例名称。你能做的最好的就是定义一个宏

     `define inst(name,number) IBUFDS IBUFDS_``name \
            ( \
             .I (input1_reg[number]),  \      
            .IB (input1b_reg[number]), \
            .O  (output_reg[number])   \
             );
    
    `inst(chicken,0)
    `inst(roster,1);
    

    【讨论】:

    • 我已经编辑了我的初始问题以在实例名称和信号中包含字符串和数字,所以它看起来像这样 .I (input1_reg[fire_1_starter]),而不是 .I (input1_reg[[1 ]),但是我认为您的答案本质上涵盖了宏定义。我会试试的:)谢谢!!
    • 如何生成像“GROUP_*”这样的字符串? `define makegroup(number) "GROUP_``number",用于verilog属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2020-02-20
    • 1970-01-01
    • 2018-12-07
    • 2015-06-05
    • 2020-09-10
    相关资源
    最近更新 更多