1、smic的memory生成
执行sram_sp_hd_rvt_rvt出现配置单口sram的界面。
执行sram_dp_hd_rvt_rvt出现配置双口sram的界面。
执行rf_sp_hd_rvt_rvt出现配置单口regfile的界面。
Multiplexer Width影响sram的形状,偏向块状还是条形装
Word-Write Mask配置是否可按byte操作(即WEN是1比特还是多比特)
Top Metal Layer是金属层配置
VIEWS选择Synopsys Model可以修改默认的library名USERLIB为其它名字
2、lib转db
上一步生成的lib文件需要工具转换为db文件,以供design compiler综合。
这个转换工具就是Library Compiler,和dc_shell是在同一个目录bin文件夹下。
工具名是lc_shell。也可用lc_shell-t工具
(1)输入lc_shell后进入命令界面,
(2)输入read_lib xxx.lib,读取lib文件,结果会显示
其中1表示成功,SRAM_4096X48_SP_nldm_ss_1p08v_1p08v_125c是library名,用于下一步
(3)输入write_lib library名 -format db -output xxx.db
这里的library名就是第2步回显的SRAM_4096X48_SP_nldm_ss_1p08v_1p08v_125c,跟read_lib xxx.lib的xxx值不一定一样。
另:模拟模型的lib文件格式可参考数字集成电路低功耗物理实现技术与UPF
附一个模板
library(ana_top) {
/* unit attributes */
time_unit : "1ns";
voltage_unit : "1V";
current_unit : "1uA";
pulling_resistance_unit : "1kohm";
leakage_power_unit : "1nW";
capacitive_load_unit(1,pf);
/* threshold definitions */
slew_lower_threshold_pct_rise : 10 ;
slew_upper_threshold_pct_rise : 90 ;
slew_lower_threshold_pct_fall : 10 ;
slew_upper_threshold_pct_fall : 90 ;
input_threshold_pct_fall : 50 ;
input_threshold_pct_rise : 50 ;
output_threshold_pct_rise : 50 ;
output_threshold_pct_fall : 50 ;
slew_derate_from_library : 0.5;
/********************************************************************/
nom_process : 1.000;
nom_temperature : 125.000;
nom_voltage : 1.08;
operating_conditions("ss_V1p08_125C"){
process : 1.0;
temperature : 125;
voltage : 1.08;
tree_type : "balanced_tree" ;
}
default_operating_conditions : ss_V1p08_125C;
/********************************************************************/
voltage_map(PAD_VSSA , 0.0);
voltage_map(PAD_VDDA , 1.2);
voltage_map(VDD_CORE ,1.2);
type (bus_1_0) {
base_type : array ;
data_type : bit
bit_width : 2
bit_from : 1
bit_to : 0 ;
downto : true ;
}
type (bus_11_0) {
base_type : array ;
data_type : bit
bit_width : 12
bit_from : 11
bit_to : 0 ;
downto : true ;
}
cell(ana_top) {
area : 10000;
pg_pin (PAD_VSSA) {
voltage_name : PAD_VSSA ;
pg_type : primary_ground;
}
pg_pin (PAD_VDDA) {
voltage_name : PAD_VDDA ;
pg_type : primary_power;
}
pin(PAD_WAKEUP) {
direction : inout ;
capacitance : 0.001;
}
pg_pin (VDD_CORE) {
voltage_name : VDD_CORE ;
pg_type : primary_power;
}
pin(adc_in0) {
direction : inout ;
capacitance : 0.001;
}
pin(adc_in1) {
direction : inout ;
capacitance : 0.001;
}
pin(adc_in2) {
direction : inout ;
capacitance : 0.001;
}
pin(adc_in3) {
direction : inout ;
capacitance : 0.001;
}
pin(pll_force_lock) {
direction : input ;
max_transition : 2.5;
capacitance : 0.001;
}
pin(pll_enable) {
direction : input ;
max_transition : 2.5;
capacitance : 0.001;
}
pin(adc_enable) {
direction : input ;
max_transition : 2.5;
capacitance : 0.001;
}
pin(adc_clk) {
direction : input ;
max_transition : 2.5;
capacitance : 0.001;
}
pin(enable_irc) {
direction : input ;
max_transition : 2.5;
capacitance : 0.001;
}
pin(nrst_b) {
direction : output ;
capacitance : 0.001;
}
pin(pll_clkout) {
direction : output ;
capacitance : 0.001;
clock : true;
}
pin(pll_locked) {
direction : output ;
capacitance : 0.001;
}
pin(adc_valid) {
direction : output ;
capacitance : 0.001;
}
pin(irc_clkout) {
direction : output ;
capacitance : 0.001;
clock : true;
}
pin(por) {
direction : output ;
capacitance : 0.001;
}
bus(adc_sel) {
bus_type : bus_1_0 ;
direction : input ;
max_transition : 2.5;
pin(adc_sel[0]) {
capacitance : 0.001;
}
pin(adc_sel[1]) {
capacitance : 0.001;
}
}
bus(adc_dout) {
bus_type : bus_11_0 ;
direction : output ;
pin(adc_dout[0]) {
capacitance : 0.001;
}
pin(adc_dout[1]) {
capacitance : 0.001;
}
pin(adc_dout[2]) {
capacitance : 0.001;
}
pin(adc_dout[3]) {
capacitance : 0.001;
}
pin(adc_dout[4]) {
capacitance : 0.001;
}
pin(adc_dout[5]) {
capacitance : 0.001;
}
pin(adc_dout[6]) {
capacitance : 0.001;
}
pin(adc_dout[7]) {
capacitance : 0.001;
}
pin(adc_dout[8]) {
capacitance : 0.001;
}
pin(adc_dout[9]) {
capacitance : 0.001;
}
pin(adc_dout[10]) {
capacitance : 0.001;
}
pin(adc_dout[11]) {
capacitance : 0.001;
}
}
}
}
说明一点voltage_name的名字用的是前面voltage_map定义了的名字