Design Compiler:使用analyze/elaborate命令读取RTL设计
相关阅读Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482Design Compiler可以使用analyze命令配合elaborate命令读取RTL设计本文将对此进行详细阐述。analyze命令analyze -format verilog/sverilog/vhdl **使用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%257Drequest_idaf5b6a559703cfd884b471ced38e180fbiz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-143470583-null-null.nonecaseutm_termVCSspm1018.2226.3001.4450analyze命令会检查设计中的语法错误生成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命令在待解析设计的父设计所在的设计库中解析引用并构建设计随后以设计库从新到旧定义的顺序解析引用并构建设计如果希望指定解析使用的库顺序需要在analyze命令时使用-uses选项为简便起见本文不对此进行详细说明最后执行一个隐式的link命令搜索link_path以及search_path并尝试解析当前设计中的其余引用。需要注意的是如果待解析的引用已读取进内存则elaborate命令不会重复构建设计如果如果待解析的引用在link_path以及search_path中可以被解析elaborate命令不会利用中间文件构建设计即如果一个设计同时在RTL和link_path中的逻辑库定义中存在以逻辑库定义为准。关于link_path以及search_path的详细信息参考下面这篇博客。Design Compiler目标(target)库、链接(link)库、符号(symbol)库、综合(synthetic)库和物理(physical)库的详细解析https://blog.csdn.net/weixin_45791458/article/details/143029536?ops_request_misc%257B%2522request%255Fid%2522%253A%2522502d65d2eef7fed72c9e2e11697448a3%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_id502d65d2eef7fed72c9e2e11697448a3biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-143029536-null-null.nonecaseutm_termlinkspm1018.2226.3001.4450默认情况下将使用默认设计库WORK和DEFAULT中的指定设计如果想指定其他设计库需要使用-work选项或-library选项。举例说明下面是三个分属于三个文件的模块其中顶层模块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 top.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代码中进行参数覆盖参考下面这篇博客。Verilog参数(parameter)的使用https://blog.csdn.net/weixin_45791458/article/details/143085525?ops_request_misc%257B%2522request%255Fid%2522%253A%252217bedd30cc17b2ff239d336b34b6a2ee%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_id17bedd30cc17b2ff239d336b34b6a2eebiz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-143085525-null-null.nonecaseutm_term%E5%8F%82%E6%95%B0spm1018.2226.3001.4450下面将举例进行说明。​// 文件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 WIDTH20elaborate命令将会有以下提示其中当前设计top名为top_WIDTH而不是top这是因为每个参数化设计在链接时会根据其参数名/参数值进行重命名。Current design is now top_WIDTH20. Information: Building the design parametric_adder instantiated from design top_WIDTH20 with the parameters WIDTH20. (HDL-193)使用list_designs命令可以更清晰地看到这一点。dcnxt_shell list_designs parametric_adder_WIDTH20 top_WIDTH20 (*)有关参数化设计重命名的内容参考下面这篇博客Formality和Design Compiler是类似的。Formality参数化设计的命名规则https://blog.csdn.net/weixin_45791458/article/details/144952855?ops_request_misc%257B%2522request%255Fid%2522%253A%2522b11f9802a932c59e271f1f63d719ec85%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_idb11f9802a932c59e271f1f63d719ec85biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-6-144952855-null-null.nonecaseutm_term%E5%8F%82%E6%95%B0spm1018.2226.3001.4450一些好的建议建议在使用elaborate命令后显式使用link命令正如Design Compiler的手册中所说“当某些实例无法解析时elaborate命令会针对这些实例发出错误信息返回状态为1并继续解析其他所有实例而不会中止展开过程。在展开过程中发出的链接错误信息被视为警告信息应该在读取设计后执行显式的link命令。”elaborate top if {[link] 0} {exit}建议在使用elaborate命令后使用check_design命令它可以检查当前设计的连接性和层次结构问题。例如检查缺失的端口或未连接的输入引脚、递归层次结构和多次实例化。​elaborate top if {[link] 0} {exit} check_design中间文件管理在大型设计中使用analyze命令处理大量文件可能会导致文件系统压力产生大量中间文件通过减少写入磁盘的文件数量可以减少磁盘访问等待来提升运行时间从Design Compiler 2018版本开始可以通过2018版本引入的hdlin_intermediate_file_method变量控制中间文件的行为当设置为legacy默认值时与之前版本一致中间文件将保存在设计库中当设置为compact时数据将保存在设计库中的单一文件default.hdllib中当设置为none时数据将保存在内存中而不是磁盘中此时必须在同一个会话中使用analyze命令和elaborate命令如果文件系统性能较差与将文件存储在磁盘相比此时运行时间可能会显著提升。如果hdlin_auto_save_templates变量设置为true那么该变量也会影响read_verilog和read_sverilog命令。需要注意的是该功能只对Verilog文件和SystemVerilog文件生效尚不支持VHDL文件。