我试图通过使用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
答案 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