【问题标题】:defparam inside generate block in veilog在verilog中生成块内的defparam
【发布时间】:2016-04-19 07:47:30
【问题描述】:

在设计中,顶层模块 A 有另一个模块 B 的两个实例化

module A (....);
B (.C(C1)...) inst1;
B (.C(C2)...) inst2;

模块 B 有一些参数,我想使用生成块从测试台分配。

//Testbench
module test_top ();
A (....) A1;
generate 
for (genvar k = 0; k<2; k++) begin
    defparam A1.instk.C = 0;
end
endgenerate 

NCSIM 上的编译导致 defparam 语句出错。其中无法获取实例的路径。可能是因为生成语句。 在生成块中使用 defparam 是否合法?

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    首先,不要使用defparam - 它已被弃用。而是使用#( ... ) 语法设置参数。

    其次,如果您希望使用 genvar 引用模块 B 的实例,则需要在生成循环中。

    最后,如果您确实想在generate 中使用分层命名,那么您必须在generate 语句中命名块。 initial 块中的 $display 给出了一个示例 - 模块实例 A1 内部的 I 的分层名称。

    例如:

    module A #(integer WIDTH) (input [WIDTH-1:0] I, output [WIDTH-1:0] O);
    
      generate 
        for (genvar k = 0; k<WIDTH; k++) begin : BLOCK_NAME
          B #(.WIDTH(WIDTH),.BIT(k)) Binst (.I(I), .O(O[k]));
        end
      endgenerate 
    
    endmodule
    
    module B #(integer WIDTH, BIT) (input [WIDTH-1:0] I, output O);
    
      assign O = I[BIT];
    
    endmodule
    
    module test_top;
    
      reg [1:0]  I;
      wire [1:0] O;
    
      A #(.WIDTH(2)) A1 (.I(I), .O(O));
    
      initial
        $display("I[1]= %b", test_top.A1.BLOCK_NAME[1].Binst.I);
    
    endmodule
    

    http://www.edaplayground.com/x/4PyL

    【讨论】:

    • 如何在test_top模块中为Binst提供不同的参数“BIT”值,其中“模块A”未在模块“test_top”中定义?
    • @Sourabh 好吧,我想你必须使用defparam,但是最好重构你的代码,这样就没有必要了。我的示例展示了分层命名如何与 generate 语句一起使用。
    • 次要更正:defparam尚未被弃用,但它计划被弃用。请参阅IEEE Std 1800-2012 § C.4.1 Defparam 语句:“强烈建议不要使用defparam 语句的做法。鼓励工程师利用显式内联参数重新定义功能。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多