资讯动态

Formality:子网表的产生

发布时间:2026/9/17 13:28:03 来源:尧图企业网站定制
相关阅读Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482目录前言前提现象没有子网表的情况有子网表的情况原因前言当加载了SVF文件后Formality会创建子目录formality_svf并在其中保留svf.txt这是已加载的SVF文件解密后的内容但有时候还会出现另一个子目录名字为d1之类的其内部保留了.a结尾的文件这其实是部分二进制形式的网表。为什么会有这样的行为呢首先得了解DesignWare库是如何使用的。前提正如下文所说过的不管是利用运算符推断还是显式例化最终都要选择实现方式如图1所示。Design Compiler目标(target)库、链接(link)库、符号(symbol)库、综合(synthetic)库和物理(physical)库的详细解析https://blog.csdn.net/weixin_45791458/article/details/143029536?ops_request_misc%257B%2522request%255Fid%2522%253A%25228cb510093a3d894b8977852c2140d9e3%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_id8cb510093a3d894b8977852c2140d9e3biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-143029536-null-null.nonecaseutm_term%E7%BB%BC%E5%90%88%E5%BA%93spm1018.2226.3001.4450图1 DesignWare的映射过程下面用乘法运算符的推断为例进行说明module multiplier_8x8 ( input [7:0] a, // 8位输入a input [7:0] b, // 8位输入b output [15:0] product // 16位输出product ); // 乘法操作 assign product a * b; endmodule当Design Compiler读取上述RTL代码时其内置的HDL Compiler会将乘法运算符映射为GTECH格式或者说图1中的Synthetic operator如图2所示。图2 GTECH格式的网表图3的单元报告能更清晰地说明运算符的映射单元名是MULT_UNS_OP_8_8_16。图3 综合前的单元报告图4是使用compile命令综合后的单元报告说明单元被映射到了DesignWare组件或者说图1中的Synthetic modules名字为multiplier_8x8_DW02_mult_0其实严格意义上说DW02_mult才是Synthetic modules如下文所说。图4 综合后的单元报告但仅凭以上信息还不能知道Synthetic modules的具体实现图5使用report_resources命令给出了更详细的报告。图5 数据通路报告其中说明了Synthetic modules和其实现方式csa图6给出了DW02_mult的全部实现方式。图6 DesignWare手册其中csa实现不需要额外的License即来自标准综合库standard.sldb在使用compiler命令进行综合时使用而pparch和apparch实现需要额外License即来自进阶综合库dw_foundation.sldb在使用compiler_ultra命令进行综合时使用。现象没有子网表的情况下面回到正题假设前提中的综合产生了SVF文件default.svf下面是加载之后子目录formality_svf中的svf.txt内容此时并没有额外的子目录。# Active SVF file /home/zhangchen/Desktop/test1/default.svf #----------------------------------------------------------------------------- # This file is automatically generated by Design Compiler # Filename : /home/zhangchen/Desktop/test1/default.svf # Timestamp : Tue Jan 14 00:03:50 2025 # DC Version: O-2018.06-SP1 (built Jul 19, 2018) #----------------------------------------------------------------------------- guide guide_environment \ { { cwd /home/zhangchen/Desktop/test1 } } guide_mark \ -type { svfMarkTypeBegin } \ -phase { svfMarkPhasePresto } guide_info \ -version { /home/zhangchen/Desktop/test1/test.v 15.078 } guide_mark \ -type { svfMarkTypeEnd } \ -phase { svfMarkPhasePresto } guide_environment \ { { read_verilog /home/zhangchen/Desktop/test1/test.v } \ { current_design multiplier_8x8 } \ { target_library fast.db } \ { current_design multiplier_8x8 } } guide_transformation \ -design { multiplier_8x8 } \ -type { map } \ -input { 8 src9 } \ -input { 8 src10 } \ -output { 16 src11 } \ -pre_resource { { 16 } mult_9 MULT_TC { { src9 } { src10 } { 0 } } } \ -pre_assign { src11 { mult_9.out.1 } } \ -post_resource { { 16 } mult_9 MULT_TC { { src9 } { src10 } { 0 } } } \ -post_assign { src11 { mult_9.out.1 } } guide_uniquify \ -design { multiplier_8x8 } \ { { mult_9 multiplier_8x8_DW02_mult_0 } } guide_multiplier \ -design { multiplier_8x8 } \ -instance { mult_9 } \ -arch { csa } guide_environment \ { { current_design multiplier_8x8 } } #---- Recording stopped at Tue Jan 14 00:31:44 2025 setup从上面的信息可以看出其中的guide_multiplier命令说明了乘法器的实现架构csa这有助于构建参考设计。有子网表的情况假设使用compiler_ultra命令进行综合此时单元报告如图7所示。图7 数据通路报告可以看出此时选择了apparch作为实现方式下面是加载之后子目录formality_svf中的svf.txt内容此时存在额外的子目录d1。需要注意的是由于compiler_ultra命令会默认对Synthetic modules进行解组因此看不到类似图4的单元报告如果想改变这个行为将compile_ultra_ungroup_dw变量设置为false即可默认值为true。在Synthetic modules较小比如三位乘法器时无论是compile命令还是compiler_ultra命令都会对Synthetic modules进行解组此时无论compile_ultra_ungroup_dw变量为何值。# Active SVF file /home/zhangchen/Desktop/test1/default.svf #----------------------------------------------------------------------------- # This file is automatically generated by Design Compiler # Filename : /home/zhangchen/Desktop/test1/default.svf # Timestamp : Tue Jan 14 00:34:43 2025 # DC Version: O-2018.06-SP1 (built Jul 19, 2018) #----------------------------------------------------------------------------- guide guide_environment \ { { cwd /home/zhangchen/Desktop/test1 } } guide_mark \ -type { svfMarkTypeBegin } \ -phase { svfMarkPhasePresto } guide_info \ -version { /home/zhangchen/Desktop/test1/test.v 15.078 } guide_mark \ -type { svfMarkTypeEnd } \ -phase { svfMarkPhasePresto } guide_environment \ { { read_verilog /home/zhangchen/Desktop/test1/test.v } \ { current_design multiplier_8x8 } \ { link_library dw_foundation.sldb } } guide_change_names \ -design { multiplier_8x8 } \ { { cell mult_9 mult_x_1 } } guide_uniquify \ -design { multiplier_8x8 } \ { { mult_x_1 multiplier_8x8_DW_mult_uns_J1_0 } } guide_architecture_netlist \ -file { netlists/S1/J1/dw-1 } \ { fast } guide_multiplier \ -design { multiplier_8x8 } \ -instance { mult_x_1 } \ -arch { apparch } \ -body { multiplier_8x8_DW_mult_uns_J1_0 } guide_environment \ { { link_library } } guide_environment \ { { current_design multiplier_8x8 } } #---- Recording stopped at Tue Jan 14 01:00:45 2025 setup从上面的信息可以看出其中的guide_architecture_netlist命令说明了子网表的存在而guide_multiplier命令说明了乘法器的实现架构apparch。顺带一提如果想强制一个运算符的实现方式可以显式例化Synthetic modules并在Design Compiler中使用set_implementation命令这只针对compile命令如果使用compile_ultra命令Design Compiler可能拒绝用户设置的实现方式并选择有更好结果质量(QoR)的实现。原因如果你够仔细从图6的注释小字就可以发现端倪其中说到“pparch针对延迟优化和 apparch针对面积优化实现是动态生成的旨在最佳地满足您的约束条件。pparch和apparch实现可以生成各种乘法器架构包括Radix-2非Booth编码、Radix-4非Booth编码、Radix-4 Booth编码和Radix-8 Booth编码。”也就是说就算作为一种实现方式pparch和apparch也可以再次细分因此只用guide_multiplier命令不能唯一地确定乘法器的结构因此需要guide_architecture_netlist命令以及额外的子网表。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价