项目中遇到一个问题:
一个generate RTL代码里面if判断是参数判断。正常仿真能过,但DC编译报错。
DC 报错 syntax error on a obsolute verilog 2001 construct standalone generate block (VER-946)
网上论坛有人同样遇到了,但没有啥确切结论。
代码类似写法如下:
generate begin if(PARAMETER1)begin
a = ……;
b = ……;
end
else begin
a = ……;
b = ……;
end
end
endgenerate
一般我是不会这么写的,对于不同参数的情况,都是单独定义一个define,然后靠ifdef完成。
但是这样写VCS能编译过,说明verilog 语法还是支持的。
然后学习了几篇博客上的说法
verilog可以用generate if实现判断常量,且只能判断常量。
那为啥上面会出错呢?
因为generate if中generate后面不能加begin end。上面代码标红的begin end不加就可以过了。
这里补充一下 generate的三个用法
1. generate for
一般常用generate for 完成电路多次例化。
在使用前必须添加一个genvar 变量,用于for 循环。
for循环下要有begin end,而且要例化个名字。不然一些仿真器会报错。
博客中举的例子:
genvar i;
generate
for (i = 0; i < 15; i++)
begin: xorLoop
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
dout[i] <= 1'b0;
end
else begin
dout[i] <= din0[i] ^ din1[i];
end
end
endgenerate
genvar i;
generate
for (i = 0; i < 15; i++)
begin: xorLoop
xor u_xor(
.dout (dout[i]),
.din0 (din0[i]),
.din1 (din1[i])
);
end
endgenerate
2. generate if
generate -if 语句不需要 genvar,可以不对 generate 块进行命名,要不写 begin / end。
parameter div = 8;
generate
if (div == 4) begin: u1
div4 u_div4(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
end
else if (div == 8) begin: u1
div8 u_div8(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
end
endgenerate
3. generate case
跟generate if 功能相同
parameter div = 8;
generate
case(div)
4: div4 u_div4(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
8: div8 u_div8(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
endcase
endgenerate