相关阅读
Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm=1001.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%257D&request_id=8cb510093a3d894b8977852c2140d9e3&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-143029536-null-null.nonecase&utm_term=%E7%BB%BC%E5%90%88%E5%BA%93&spm=1018.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命令以及额外的子网表。