之后我们得到一个该模块的lef文件,下面我们就用这个模块做一次调用。
9将此macro作为一个模块在另外一个top设计中进行调用。
第一步:首先我们还是回到综合,我们重新设计一个top,这个top将包含新的逻辑功能,之前的mux模块,还有PAD模块。这个设计的大概框图如下:
PDIDGZ为数字输入IO口 PDO04CDG为数字输出IO口 PVDD1DGZ 为供电PAD高电端 PVSS1DGZ 为供电PAD的地电端 Multiple为之前做的宏模块 Mux为新加逻辑
第二步,代码的改写:
我们重新编写过verilog代码(带PAD),带PAD做综合有个好处,可以不用设置输入输出端口的驱动,因为PAD的驱动已经很大了,这样综合出的结果更接近实际。 新的verilog代码如下:
module mux_1 (clk,clr,a,b,y);//(这里我们引用了新的逻辑,注意这个mux_1和之前的没半点关系,只是为了体现调用关系随便加的一个而已) input clk,clr; input [7:0] a,b; output [15:0] y; reg [15:0] y;
always @(posedge clk) begin
if(!clr)
begin
y<=0; end else begin
y<=a*b; end end
endmodule module
PAD(clk_pcb,clk_core,clr_pcb,clr_core,data1_pcb,data1_core,data2_pcb,data2_core,dataout_core,dataout_pcb);(这是PAD模块,注意结合前面的框图是想想是如何加的) input clk_pcb,clr_pcb; output clk_core ,clr_core;
input [7:0] data1_pcb,data2_pcb; output [7:0] data1_core,data2_core; input [15:0] dataout_core; output [15:0] dataout_pcb;
PDIDGZ PAD_CLK (.PAD(clk_pcb),.C(clk_core)); PDIDGZ PAD_CLR (.PAD(clr_pcb),.C(clr_core));
PDIDGZ PAD_DATA1_0 (.PAD(data1_pcb[0]),.C(data1_core[0])); PDIDGZ PAD_DATA1_1 (.PAD(data1_pcb[1]),.C(data1_core[1])); PDIDGZ PAD_DATA1_2 (.PAD(data1_pcb[2]),.C(data1_core[2])); PDIDGZ PAD_DATA1_3 (.PAD(data1_pcb[3]),.C(data1_core[3])); PDIDGZ PAD_DATA1_4 (.PAD(data1_pcb[4]),.C(data1_core[4])); PDIDGZ PAD_DATA1_5 (.PAD(data1_pcb[5]),.C(data1_core[5])); PDIDGZ PAD_DATA1_6 (.PAD(data1_pcb[6]),.C(data1_core[6])); PDIDGZ PAD_DATA1_7 (.PAD(data1_pcb[7]),.C(data1_core[7])); PDIDGZ PAD_DATA2_0 (.PAD(data2_pcb[0]),.C(data2_core[0])); PDIDGZ PAD_DATA2_1 (.PAD(data2_pcb[1]),.C(data2_core[1])); PDIDGZ PAD_DATA2_2 (.PAD(data2_pcb[2]),.C(data2_core[2])); PDIDGZ PAD_DATA2_3 (.PAD(data2_pcb[3]),.C(data2_core[3])); PDIDGZ PAD_DATA2_4 (.PAD(data2_pcb[4]),.C(data2_core[4])); PDIDGZ PAD_DATA2_5 (.PAD(data2_pcb[5]),.C(data2_core[5])); PDIDGZ PAD_DATA2_6 (.PAD(data2_pcb[6]),.C(data2_core[6])); PDIDGZ PAD_DATA2_7 (.PAD(data2_pcb[7]),.C(data2_core[7]));
PDO04CDG PAD_DATAOUT_0 (.I(dataout_core[0]),.PAD(dataout_pcb[0])); PDO04CDG PAD_DATAOUT_1 (.I(dataout_core[1]),.PAD(dataout_pcb[1])); PDO04CDG PAD_DATAOUT_2 (.I(dataout_core[2]),.PAD(dataout_pcb[2])); PDO04CDG PAD_DATAOUT_3 (.I(dataout_core[3]),.PAD(dataout_pcb[3])); PDO04CDG PAD_DATAOUT_4 (.I(dataout_core[4]),.PAD(dataout_pcb[4])); PDO04CDG PAD_DATAOUT_5 (.I(dataout_core[5]),.PAD(dataout_pcb[5])); PDO04CDG PAD_DATAOUT_6 (.I(dataout_core[6]),.PAD(dataout_pcb[6]));
PDO04CDG PAD_DATAOUT_7 (.I(dataout_core[7]),.PAD(dataout_pcb[7])); PDO04CDG PAD_DATAOUT_8 (.I(dataout_core[8]),.PAD(dataout_pcb[8])); PDO04CDG PAD_DATAOUT_9 (.I(dataout_core[9]),.PAD(dataout_pcb[9])); PDO04CDG PAD_DATAOUT_10 (.I(dataout_core[10]),.PAD(dataout_pcb[10])); PDO04CDG PAD_DATAOUT_11 (.I(dataout_core[11]),.PAD(dataout_pcb[11])); PDO04CDG PAD_DATAOUT_12 (.I(dataout_core[12]),.PAD(dataout_pcb[12])); PDO04CDG PAD_DATAOUT_13 (.I(dataout_core[13]),.PAD(dataout_pcb[13])); PDO04CDG PAD_DATAOUT_14 (.I(dataout_core[14]),.PAD(dataout_pcb[14])); PDO04CDG PAD_DATAOUT_15 (.I(dataout_core[15]),.PAD(dataout_pcb[15])); PVDD1DGZ vdd1 (); (现在不用加的) PVDD1DGZ vdd2 (); PVDD1DGZ vdd3 (); PVDD1DGZ vdd4 (); PVSS1DGZ vss1 (); PVSS1DGZ vss2 (); PVSS1DGZ vss3 (); PVSS1DGZ vss4 (); PCORNERDG c1 (); PCORNERDG c2 (); PCORNERDG c3 (); PCORNERDG c4 (); endmodule
#############################顶层模块######################### module top(clock,clear,da1,da2,dataout_out); input clock,clear; input [7:0] da1,da2;
output [15:0] dataout_out; wire clk_core,clr_core;
wire [7:0] data1_core,data2_core; wire [15:0] dataout_core; wire [15:0] y; PAD
PAD_TOP(.clk_pcb(clock),.clk_core(clk_core),.clr_pcb(clear),.clr_core(clr_core),.data1_pcb(da1),.data1_core(data1_core),.data2_pcb(da2),.data2_core(data2_core),.dataout_core(dataout_core),.dataout_pcb(dataout_out));
mux_1 mux_1 (.clk(clk_core),.clr(clr_core),.a(data1_core),.b(data2_core),.y(y)); mux mutiple (.clk(clk_core),.clr(clr_core),.data1(y[15:8]),.data2(y[7:0]),.dataout(dataout_core));(这里是对硬核的调用) endmodule
第三步:逻辑综合
注意的是,我们在逻辑综合之前,需要加如mux的db库文件,此文件由encounter布局布
线以后产生的延时文件再经过pt静态时序分析以后产生。 我们给顶层模块加如约束: Current_design top link
create_clock -period 10 [get_ports clock]
set_clock_latency -source -max 0.2 [get_ports clock] set_clock_latency -max 0.1 [get_ports clock]
set_clock_uncertainty -setup 0.01 [get_ports clock]
set_input_delay -max 0.5 -clock clock [all_inputs] set_output_delay -max 0.5 -clock clock [all_outputs]
#set_driving_cell -lib_cell INVX4 [all_inputs] #set_load -pin_load 0.0659726 [all_outputs]
set_wire_load_model -name tsmc18_wl10 -library typical set_wire_load_mode enclosed
set_dont_touch mux (注意此处,就是综合的时候不针对mux进行综合,综合工具会自动跨越边界对其他逻辑进行综合)
set_dont_touch_network [all_clocks]
compile -boundary
change_names -rule verilog -hier
write -format verilog -hier -output top.sv write -format ddc -hier -output top.ddc write_sdf top.sdf write_sdc top.sdc 第四步:布局布线
用综合得到的网表(top.sv)和约束文件(sdc)。并将之前的mux模块的lef文档准备好。 这里碰到了一个问题,在逻辑综合之前的代码我已经加如了PAD的VDD ,VSS和corner,但是综合完以后就不见了,原因不明,这时在布局之前就要手动添加上去。 数据准备:
顶层模块网表文件:mux.sv
物理库文件:tsmc18_6lm_cic.lef(tech以及std的lef),mux_block.lef和PAD的lef 时序文件:对应于上面的lib文件,typical.lib,block的lib(由PT产生),PAD的lib Io文件:可以自己定义顶层端口的位置(下面会介如何做io文件) Sdc文件:综合后产生的约束文件。
Io文件的设置,主要由四个方向决定,N,W,S,E就和我们英文里的四个方向的首字母一样,当然还有NW,WS,SE,NE,四个角,是用与corner的摆放,该设计有34个口,外加8个供电PAD,加上四个CORNER总共有46个PAD,主要的是42个PAD,我们可以将这42个PAD放到自己想设置的位置,对于一个真正的设计,要考虑以后连线的长度,内部模块摆放位置等,来合理安排io的位置。
如图所示为该设计的PAD布局图:
DATA_OUT_13DATA_OUT_12DATA_OUT_14DATA_OUT_15PAD_CLKvdd2DATA1_0DATA1_1DATA1_2DATA1_3DATA_OUT_11DATA_OUT_10DATA_OUT_9DATA_OUT_8vss1vdd1DATA_OUT_7DATA_OUT_6DATA_OUT_5DATA_OUT_4vss2DATA1_4DATA1_5DATA1_6DATA1_7vss3vdd3DATA2_0DATA2_1DATA2_2DATA2_3TOP
根据此布局图,我们对此设计的io文件编辑如下,io文件对应实际布局中的规则是,N是由io文件列表的顺序从左到右的放置,W方向是由下到上的放置,S同N,E同W。 Pad: PAD_TOP/PAD_DATAOUT_12 N Pad: PAD_TOP/PAD_DATAOUT_13 N Pad: PAD_TOP/PAD_DATAOUT_14 N Pad: PAD_TOP/PAD_DATAOUT_15 N Pad: PAD_TOP/PAD_CLK N Pad: PAD_TOP/vss2 N Pad: PAD_TOP/vdd2 N
Pad: PAD_TOP/PAD_DATA1_0 N Pad: PAD_TOP/PAD_DATA1_1 N Pad: PAD_TOP/PAD_DATA1_2 N Pad: PAD_TOP/PAD_DATA1_3 N Pad: PAD_TOP/c1 NE Orient: R0
Pad: PAD_TOP/c2 SW
Pad: PAD_TOP/PAD_DATAOUT_4 W Pad: PAD_TOP/PAD_DATAOUT_5 W Pad: PAD_TOP/PAD_DATAOUT_6 W Pad: PAD_TOP/PAD_DATAOUT_7 W
Pad: PAD_TOP/vdd1 W Pad: PAD_TOP/vss1 W
Pad: PAD_TOP/PAD_DATAOUT_8 W Pad: PAD_TOP/PAD_DATAOUT_9 W
DATA_OUT_3DATA_OUT_1DATA_OUT_2DATA_OUT_0PAD_CLRvdd4DATA2_7DATA2_5DATA2_6DATA2_4vss4