细数Quartus系列综合器对SystemVerilog支持上的5个槽点

Quartus II以及后来的Quartus Prime(截止本文写作时其最新版本是v16.1)是Altera公司为自家FPGA编写的集成开发环境,包括编译、综合工具。工具不错,但对SystemVerilog的支持实在槽点多多,下面仅列出本人遇到的5个无力吐槽的编译器大BUG:

1.不支持在interface中声明interface的实例

示例代码:


interface test_if #(
   parameter BITW = 16
);
   logic [BITW-1:0] sigs;
endinterface

interface nest_if #(
   parameter BITW = 16
);
   test_if #(.BITW(BITW)) tifi();
endinterface

module multiinstif #(
   parameter BITW = 8
) ;
   nest_if #(.BITW(BITW)) nifi();
endmodule

现象:quartus_map.exe直接崩溃,屡试不爽!
受影响的版本:Quartus Prime v16.0、v16.1,旧版Quartus还未测试,也懒得测试了-_-!
官方给出的解决方案:工程目录下新建一个quartus.ini文件,在其中加入一行:sgn_use_new_verific = on
解决方案可行性:可以编译通过,但貌似该模式仍然是未完善的状态,某些语言特性无法得到支持,例如——多维数组信号
评价:看你运气了,大工程的话效果会怎么样实在不敢想象。

2.对interface中的条件generate代码支持不好

示例代码:

interface test_gen_if #(
   parameter int BITW = 16
);
   generate
       if (BITW > 0) begin: SIGS
           logic[BITW-1:0] sigs;
       end: SIGS
   endgenerate
endinterface

module multiinstif(
   input clk,
   input rst
);
   test_gen_if #(.BITW(0)) tgifi_01();
   test_gen_if #(.BITW(0)) tgifi_02();
   test_gen_if #(.BITW(0)) tgifi_03();
   test_gen_if #(.BITW(0)) tgifi_04();
   test_gen_if #(.BITW(0)) tgifi_05();
endmodule

现象:当multiinstif中声明的test_gen_if实例的例化参数BITW赋值0,且声明超过4个实例时,quartus_map.exe直接崩溃,屡试不爽!
受影响的版本:QuartusPrime v16.0,v16.1版貌似已经解决了,旧版的QuartusII没测试过,同样,懒得测了-_-!
官方解决方案:还是用quartus.ini文件加入一行:sgn_use_new_verific = on 的办法
评价:同上

3.某些情况下不能正确识别和区分常量和变量

示例代码:

interface test_if #(
   parameter BITW = 16
);
   logic [BITW-1:0] sigs;
endinterface

package test_pkg;
   function automatic int test_calc(int bitw);
       return bitw + 1;
   endfunction
endpackage

module test_mod #(
   parameter BITW = 8
) ( input bit clk, input wire rst);
   test_if #(.BITW(BITW)) tifi();
   localparam int bitw_ofcalc = test_pkg::test_calc($size(tifi.sigs,1));    // on this line Quartus reports error message: can't pass value from actual to argument bitw
   initial $warning("DEBUG: bitw_ofcalc = %0d", bitw_ofcalc);
endmodule

现象:Quartus编译报告 “ can’t pass value from actual to argument bitw”,就像代码中注释的说明一样
受影响的版本:Quartus Prime v16.0、v16.1,同样的,旧版懒得测试了-_-!
官方解决方案:将代码中的 test_if #(.BITW(BITW)) tifi(); 改为 test_if #(.BITW(8)) tifi();
评价:无力吐槽——传递 BITW 的目的就是为了提高代码的可重用性,这样来整,对每一个不同值的BITW我都得写一个与test_mod代码相同但名称不同的模块,这是要累死我的节奏吗?

4.对分层标识符支持不好

示例代码:

interface test_if #(
   parameter int test_bitw = 1
);
    generate
        if (test_bitw > 0) begin: SIGS
            logic[test_bitw-1:0] sig;
        end
    endgenerate
endinterface

module test_mod(
   test_if tifi,
    output wire sig_o
);
    generate
        if (tifi.test_bitw > 0) begin: OSIG // quartus complains : constant expression cannot contain a hierarchical identifier
            assign sig_o = |tifi.SIGS.sig;
        end
    endgenerate
endmodule

现象:quartus在有注释的那一行报告”constant expression cannot contain a hierarchical identifier“
受影响的版本:Quartus II v13.1、Quartus Prime v16.0、v16.1,其他版本懒得测了,咱又不在Altera领工资-_-!
官方解决方案:等下一版Quartus Prime修复……
评价:又一次无力吐槽——SystemVerilog标准(IEEE std. 1800)中并未规定不能引用分层标识符,就算你声明自己实现的只是该标准的一个子集,那为什么按下面的代码写test_mod时又能编译了?

module test_mod(
   test_if tifi,
    output wire sig_o
);
    localparam bit osig_en = tifi.test_bitw > 0 ? 1'b1 : 1'b0;
    generate
        if (osig_en) begin: OSIG    // quartus passed the compilation with no error message
            assign sig_o = |tifi.SIGS.sig;
        end
    endgenerate
endmodule

好吧,我等……再说几句:上面的解决方案只适用于Quartus Prime v16.0、v16.1,在Quartus II v13.1上仍然绕不过去,而一些旧的芯片例如Cyclone III,则因为新版的Quartus Prime不支持,加上Altera官方并不愿意为旧版的QuartusII开发补丁,因此这样的问题便变得无解了,悲剧吧?

5.SystemVerilog代码的编译错误定位不准确

我就不放示例代码了,因为要重现这个问题太麻烦,不是简单的几行代码就能搞出来的。现象就是:Quartus编译器给出的错误信息不能完全反映代码的错误位置,有时甚至奇葩到对一行很明显没问题的语句报错,为了正确定位编译错误我不得不采用费时费力的排除法,严重降低了开发效率。
根据这些现象个人怀疑目前版本的Quartus编译器程序中存在着内存管理漏洞,导致在解析某些错误代码时触发内存访问越界或内存泄漏的问题,并最终造成这样莫名其妙的报错,由此看来,Quartus编译器的软件质量实在堪忧啊。
个人的解决办法:就像上面说的一样,采用排除法来定位编译错误,具体点就是——先不停的注释代码,直到编译器不再报错,然后在这样的代码版本基础上一块一块的增加不同位置的代码,看哪一块代码增加后会导致编译器报错。这真的是体力活儿啊!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值