本博客参考自文章链接
本文以全加器为例,演示DC综合的流程。设计文件如下:
module full_adder(
input clk,
input rstn,
input [31:0] a_in,
input [31:0] b_in,
input c_in,
output reg [31:0] sum_out,
output reg c_out
);
wire c_out_w;
wire [31:0] sum_out_w;
assign {c_out_w,sum_out_w}=a_in+b_in+c_in;
always@(posedge clk)
if(~rstn)
c_out<=0;
else
c_out<=c_out_w;
//
always@(posedge clk)
if(~rstn)
sum_out<=0;
else
sum_out<=sum_out_w;
endmodule
创建library文件夹
创建library文件夹,将工艺库文件放入此文件夹,如下图所示
设置环境变量
启动dc,输入
set_app_var search_path ./library
输入
set_app_var target_library sc_max.db
设置目标库
输入
set_app_var link_library sc_max.db
设置链接库
结果如下图所示
读入设计文件
输入命令:
read_file -format verilog {./full_adder.v}
输入后显示如下:
然后输入check_design检查设计,如下图所示
显示1,说明读取无误
添加约束
创建时钟
create_clock -period 10 [get_ports clk]
设置输入延迟
set_input_delay -max 3 -clock clk [remove_from_collection [all_inputs] clk]
设置输出延迟
set_output_delay -max 2.5 -clock clk [all_outputs]
以及设置输入转换时间
set_input_transition 0.15 [all_inputs]
最后输入check_design进行检查
check_design
整个过程如图所示:
综合
输入compile
进行综合。如下图所示
查看综合报告
输入report_clock
查看时钟
输入report_timing
查看时序报告
可以看到,slack为3.77,大于0,时序是MET的。
输入report_area
查看综合后的面积:
输出相关文件
生成一个.sdc结尾的时序约束文件:
write_sdc full_adder.sdc
文件内容就是我们添加的约束:
输出用于做后仿的.sdf时延文件:
write_sdf full_adder.sdf
输出RTL的网表文件
write_file -format verilog -output full_adder_netlist.v
网表文件的内容如下图所示
由图可以发现,网表文件是RTL代码的门级描述。
查看时序违例
为了让时序违例,首先修改时钟约束
create_clock -period 1 [get_ports clk]
然后重新输入compile
综合。
输入report_timing
,结果如下:
可以发现,将时钟约束为1ns后,时序发生违例。