verilog -- generate 后面不能加begin end

项目中遇到一个问题:

一个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 语法还是支持的。

然后学习了几篇博客上的说法

csdn

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二哈哈黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值