Design Compiler:使用analyze/elaborate命令读取RTL设计

相关阅读

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的详细信息,参考下面这篇博客。

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%257D&request_id=502d65d2eef7fed72c9e2e11697448a3&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-143029536-null-null.nonecase&utm_term=link&spm=1018.2226.3001.4450https://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%257D&request_id=502d65d2eef7fed72c9e2e11697448a3&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-143029536-null-null.nonecase&utm_term=link&spm=1018.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
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%257D&request_id=17bedd30cc17b2ff239d336b34b6a2ee&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-143085525-null-null.nonecase&utm_term=%E5%8F%82%E6%95%B0&spm=1018.2226.3001.4450https://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%257D&request_id=17bedd30cc17b2ff239d336b34b6a2ee&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-143085525-null-null.nonecase&utm_term=%E5%8F%82%E6%95%B0&spm=1018.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 "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是类似的)。

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%257D&request_id=b11f9802a932c59e271f1f63d719ec85&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-6-144952855-null-null.nonecase&utm_term=%E5%8F%82%E6%95%B0&spm=1018.2226.3001.4450https://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%257D&request_id=b11f9802a932c59e271f1f63d719ec85&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-6-144952855-null-null.nonecase&utm_term=%E5%8F%82%E6%95%B0&spm=1018.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日晨难再

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值