有没有办法在Verilog中执行嵌套的生成语句?

时间:2014-03-25 16:15:10

标签: verilog

我试图通过使用generate语句来减少一些代码,但我只能通过嵌套来弄清楚如何做,但我不相信这是允许的。

我所拥有的基本上是一些for循环运行(需要生成),并且在其中我想运行三段代码中的一段,具体取决于构建代码时设置的值(然后需要第二次生成)。有没有办法做到这一点,让工具快乐?

以下是我正在尝试的内容的快速和肮脏的图片:

    //TAPS_PER_CHAN is a value defined when the code is built
genvar srcNode, dstNode, tapIdx;
 generate
  for (dstNode=0; dstNode<NODES; dstNode=dstNode+1)
    begin: dstForLoop
    generate
        if(TAPS_PER_CHAN <= 4)
        begin
            call module one
        end    
        else if (TAPS_PER_CHAN <= 8)
        begin
            call module two
        end      
       else if (TAPS_PER_CHAN <= 16)
       begin  
            call module three
        end
    endgenerate
    end
endgenerate

2 个答案:

答案 0 :(得分:3)

是的,只需删除嵌套的generate / endgenerate个关键字。
请参阅IEEE Std 1800-2012§27生成构造

    //TAPS_PER_CHAN is a value defined when the code is built
genvar srcNode, dstNode, tapIdx;
 generate
  for (dstNode=0; dstNode<NODES; dstNode=dstNode+1)
    begin: dstForLoop
    // generate <-- remove this
        if(TAPS_PER_CHAN <= 4)
        begin
            call module one
        end    
        else if (TAPS_PER_CHAN <= 8)
        begin
            call module two
        end      
       else if (TAPS_PER_CHAN <= 16)
       begin  
            call module three
        end
    // endgenerate <-- remove this
    end
endgenerate

示例here

答案 1 :(得分:0)

一旦进入生成块,Verilog编译器/模拟器自动识别变量(if-else,for-loop)vs参数+ gen_var(if-else,for-loop) 因此,如果您将TAP_PER_CHAN定义为参数,则不需要第二次生成,并且verilog / simulator将仅生成三个模块中的一个:

它可以在我的NC-Verilog,Ascent-Lint和Novas-nTrace中识别正确的构造。

参数TAP_PER_CHAN; genvar srcNode,dstNode,tapIdx;  生成   for(dstNode = 0; dstNode         否则if(TAPS_PER_CHAN&lt; = 8)         开始             呼叫模块二         结束
       否则if(TAPS_PER_CHAN&lt; = 16)        开始
            呼叫模块三         结束     // endgenerate&lt; - 删除它     结束 endgenerate