相关阅读
Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm=1001.2014.3001.5482
Design Compiler可以使用analyze命令配合elaborate命令读取RTL设计,本文将对此进行详细阐述。
analyze命令
analyze -format verilog/sverilog/vhdl **.v
使用analyze命令类似VCS三步法的仿真流程中的分析(实际上analyze命令也确实提供了-vcs选项用于添加类vcs选项),即类似于vdhlan或vlogan命令,如下面这篇博客所说。
VCS:三步法的仿真流程https://blog.csdn.net/weixin_45791458/article/details/143470583?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522af5b6a559703cfd884b471ced38e180f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=af5b6a559703cfd884b471ced38e180f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-143470583-null-null.nonecase&utm_term=VCS&spm=1018.2226.3001.4450 analyze命令会检查设计中的语法错误,生成elaborate命令所需的中间文件(.syn、.pvl、.mr文件),源文件中每个模块都有相应的中间文件,所有的中间文件后会被保存在默认设计库中。
默认设计库的库名为WORK或DEFAULT,它们的路径是启动Design Compiler时的当前工作目录,这也就解释了为什么有时候使用analyze命令后,当前工作目录会多出许多中间文件。
如何解决这个问题呢?使用-work选项或-library选项可以指定中间文件生成的设计库(换句话说,也就指定了中间文件生成的目录),但在此之前需要创建设计库或者重定义默认设计库的路径,这是使用define_design_lib命令完成的。
define_design_lib library_name -path directory
其中library_name是设计库名,directory是设计库路径(该目录必须已创建),需要注意的是,如果使用了相对路径,则该路径会在使用命令时固定,即不会随着当前工作目录(如在Design Compiler中使用cd命令)改变。
使用report_design_lib -libraries命令可以显示所有设计库以及其路径,可以看出WORK和DEFAULT设计库是默认存在的,其中还有很多DesignWare设计库。
举例说明
下面是一个拥有两个模块的源文件(.v)。
// 文件:test.v
module top(
input wire [7:0] in_a,
input wire [7:0] in_b,
output wire [7:0] out_sum
);
adder u_adder (
.a(in_a),
.b(in_b),
.sum(out_sum)
);
endmodule
module adder(
input wire [7:0] a,
input wire [7:0] b,
output wire [7:0] sum
);
assign sum = a + b;
endmodule
在无任何设置时,Design Compiler会在当前工作目录生成中间文件,如下所示。
$ dcnxt_shell
dcnxt_shell> analyze -format verilog test.v
dcnxt_shell> quit
$ ls
ADDER.mr adder-verilog.syn default.svf test.v top-verilog.pvl
adder-verilog.pvl command.log filenames.log TOP.mr top-verilog.syn
如果使用define_design_lib命令重定义默认设计库的路径为./work,则中间文件会创建在子目录中,如下所示。
$ mkdir work
$ dcnxt_shell
dcnxt_shell> define_design_lib WORK -path ./work
dcnxt_shell> analyze -format verilog test.v # 注意此处无需指定-work选项
dcnxt_shell> quit
$ ls
command.log default.svf test.v work
$ ls ./work
ADDER.mr adder-verilog.syn top-verilog.pvl
adder-verilog.pvl TOP.mr top-verilog.syn
使用report_design_lib命令可以显示设计库中存在的模块,如下所示。
dcnxt_shell> report_design_lib
****************************************
Report : hdl libraries
Version: U-2022.12-SP1
Date : Fri Feb 7 20:31:50 2025
****************************************
Contents of current design libraries
CCSC (/home/summer/Synopsys/syn/U-2022.12-SP1/packages/ccsc/lib)
This library does not contain any valid design units.
DEFAULT (/home/summer/Desktop/test/work)
WORK (/home/summer/Desktop/test/work)
architecture : m adder(verilog)
architecture : m top(verilog)
elaborate命令
elaborate design_name
使用elaborate命令类似VCS三步法的仿真流程中的展开,即类似于vcs命令。elaborate命令会使用analyze命令生成的中间文件来构建实例层次结构(GTECH格式),并将指定设计设置为当前设计(一般情况下,这也指顶层设计)。
需要注意的是:elaborate命令首先会像link命令一样,搜索link_path以及search_path并尝试解析引用,随后尝试在指定设计的父设计所在的设计库中解析引用(如果该设计是顶层设计,则在该设计所在的设计库中解析引用),最后以设计库从新到旧定义的顺序进行解析引用。如果希望指定解析使用的库顺序,需要在analyze命令时使用-uses选项,为简便起见,本文不对此进行详细说明。
关于link_path以及search_path的详细信息,参考下面这篇博客。
举例说明
下面是三个分属于三个文件的模块,其中顶层模块top定义在top.v文件中,其中例化了adder模块,而adder模块定义在ADDER.v和adder.v文件中。
// 文件:adder.v
module adder(
input wire [7:0] a,
input wire [7:0] b,
output wire [7:0] sum
);
assign sum = a * b;
endmodule
// 文件:ADDER.v
module adder(
input wire [7:0] a,
input wire [7:0] b,
output wire [7:0] sum
);
assign sum = a + b;
endmodule
// 文件:top.v
module top(
input wire [7:0] in_a,
input wire [7:0] in_b,
output wire [7:0] out_sum
);
adder u_adder (
.a(in_a),
.b(in_b),
.sum(out_sum)
);
endmodule
情况一
假设已经将ADDER.v保存为ADDER.ddc文件,并且在link_library中指定了该文件,elaborate命令会优先在使用该.ddc文件,而不是与top模块在同一设计库的adder模块(来自adder.v文件),如下脚本所示。
define_design_lib -path ./work/ WORK
set_app_var link_library ADDER.ddc
analyze -format verilog adder.v
elaborate top // 使用ADDER.ddc而不是WORK库中的adder.v
情况二
假设adder模块(来自adder.v文件)与top模块都在WORK库中,而另一个adder模块(来自ADDER.v文件)在其他设计库中,则elaborate命令会优先在使用与top模块在同一设计库中的模块,如下脚本所示。
define_design_lib -path ./work/ WORK
define_design_lib -path ./work1/ WORK1 // 需要保证work1目录已创建
analyze -format verilog adder.v top.v
analyze -format verilog ADDER.v -work WORK1 // 需要指定-work选项
elaborate top // 使用来自WORK库的adder模块
如果发生多个设计库中存在同一模块的情况,使用elaborate命令时会发出警告,如下所示。
Warning: Instance of 'adder' is defined in both libraries
'WORK' and 'WORK1', which are both visible in design 'top'.
The first library will be used. (LINK-14)
情况三
假设adder模块(来自adder.v文件)在WORK1库中,另一个adder模块(来自ADDER.v文件)在WORK2库中(更晚定义),top模块在WORK库中,则elaborate命令会选择WORK2中的模块,如下脚本所示。
define_design_lib -path ./work/ WORK
define_design_lib -path ./work1/ WORK1 // 需要保证work1目录已创建
define_design_lib -path ./work2/ WORK2 // 需要保证work2目录已创建
analyze -format verilog top.v
analyze -format verilog ADDER.v -work WORK1 // 需要指定-work选项
analyze -format verilog adder.v -work WORK2 // 需要指定-work选项
elaborate top // 使用来自WORK2库的adder模块
与情况二类似,此时elaborate命令也发出了警告,如下所示。
Warning: Instance of 'adder' is defined in both libraries
'WORK2' and 'WORK1', which are both visible in design 'top'.
The first library will be used. (LINK-14)
覆盖参数
如果想要覆盖指定设计/顶层模块的参数,可以在使用elaborate命令时指定-parameters选项(对于非顶层模块,可以在RTL代码中进行参数覆盖,参考下面这篇博客)。
// 文件:test.v
module top #(
parameter WIDTH = 16
)(
input wire [WIDTH-1:0] in_a,
input wire [WIDTH-1:0] in_b,
output wire [WIDTH-1:0] out_sum
);
parametric_adder #(
.WIDTH(WIDTH)
) u_adder (
.a(in_a),
.b(in_b),
.sum(out_sum)
);
endmodule
module parametric_adder #(
parameter WIDTH = 8
)(
input wire [WIDTH-1:0] a,
input wire [WIDTH-1:0] b,
output wire [WIDTH-1:0] sum
);
assign sum = a + b;
endmodule
假设想将top模块的WIDTH参数设置为20,如下脚本所示。
define_design_lib -path ./work/ WORK
analyze -format verilog adder.v test.v
elaborate top -parameters "WIDTH=20"
elaborate命令将会有以下提示,其中当前设计top名为top_WIDTH而不是top,这是因为每个参数化设计在链接时会根据其参数名/参数值进行重命名。
Current design is now 'top_WIDTH20'.
Information: Building the design 'parametric_adder' instantiated from design 'top_WIDTH20' with
the parameters "WIDTH=20". (HDL-193)
使用list_designs命令可以更清晰地看到这一点。
dcnxt_shell> list_designs
parametric_adder_WIDTH20 top_WIDTH20 (*)
有关参数化设计重命名的内容,参考下面这篇博客(Foamlity和Design Compiler是类似的)。
一些好的建议
建议在使用elaborate命令后显式使用link命令,正如Design Compiler的手册中所说“当某些实例无法解析时,elaborate命令会针对这些实例发出错误信息,返回状态为1,并继续解析其他所有实例,而不会中止展开过程。在展开过程中发出的链接错误信息被视为警告信息,应该在读取设计后执行显式的link命令。”
elaborate top
if {[link] == 0} {exit}
建议在使用elaborate命令后使用check_design命令,它可以检查当前设计的连接性和层次结构问题。例如,检查缺失的端口或未连接的输入引脚、递归层次结构和多次实例化。
elaborate top
if {[link] == 0} {exit}
check_design