多文件编译单元(Multi-file compilation unit: MFCU)是FPGA IDE工具Quartus中一个比较重要设置选项,主要使用于非专业版本的Quartus工具中,比如little版本。而对于专业版本的Quartus,一般采取单文件编译单元(Single-file compilation unit: SFCU)。那么MFCU和SFCU的设置对Quartus的编译影响如何?下面的表给出它们之间的区别。
Table 1 MFCU-SFCU的区别
SFCU |
MFCU |
1.Intel® Quartus® Prime Pro Edition |
其他软件本版本 |
2.预编译宏结束于当前文件 |
预编译宏结束于指令 |
3. 全局定义include时当前文件有效 |
全局定义所有文件可见 |
4. 全局的派生定义include时当前文件有效 |
全局的派生定义所有文件可见 |
5. 文件编译顺序自动排序 |
文件编译顺序指定 |
针对第一个区别,为了Quartus的专业版中使用MFCU,我们必须在quartus工程文件qsf中显式设置工程为MFCU模式,设置如下
set_global_assignment -name VERILOG_CU_MODE MFCU
对于第二个区别,那么MFCU就要求编码严格了一点,比如有时候我们希望取消默认的端口类型,使用`default_nettype none 来强制编程者显示指定端口类型,那么对于MFCU而言,这个设置一直生效,直到遇到显示指示`default_nettype wire才会让端口默认类型是wire。因此,如果中间有文件使用默认规则,没有定义端口类型,那么quartus会报告错误”nettype must be explicitly ”。这个处理的方式是我们需要规范编码,在一个文件中`default_nettype none、`default_nettype wire必须成对出现。
对于第三和第四项区别是在整个工程中预定义的全局变量和由全局变量派生出来的全局变量,如果quartus工程设置了MFCU模式,那么在整个工程中每个文件都可以看到这个变量,因此文件中不能有同名的变量名。因此,文件也不需要显式的include预定义文件。而对于SFCU模式,为了当前文件能够引用到预定义的全局变量,需要显式include预定义文件。另外一个问题是MFCU不允许工程中存在多个文件一个module的问题,这个quartus会报告错误” Can't elaborate user hierarchy”的信息。
对于最后一项文件编译顺序问题,MFCU只支持手动的文件顺序指定,而SFCU支持自动文件顺序排序处理。因此,MFCU必须按照module的调用顺序加进工程之中,否则quartus编译的时候会报告错误信息。但是,SFCU模式quartus自动排序编译顺序,因此可以对文件加入工程的顺序不做严格要求。
参考文献
- https://www.intel.com/content/www/us/en/docs/programmable/683463/21-3/verify-verilog-compilation-unit.html
- https://community.intel.com/t5/Intel-Quartus-Prime-Software/SystemVerilog-compile-guards-and-macros/m-p/1293020