微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 综合技术问答 > EDA使用问答 > DC综合时报错 Clock clr used as data

DC综合时报错 Clock clr used as data

时间:03-15 整理:3721RD 点击:

题目:设计一个简易异步接收机,用BCD05工艺库实现(从代码到版图)。

1M==1us







1.接收机功能

发送机等价为一个11位的移位寄存器,发送数据时以固定的125KHz的频率移位。发送数据格式见图1。发送机在空闲状态下(不发送数据时)txd端口(与接收机的rxd相连)为1,由于发送数据的第一位总是0,故接收机可检测到一个“负跳变”以实现发送与接收的同步。接下来的8位是要求接收的数据,接收机应能够正确接收该数据,使接收端的b[7:0]等于发送端的b[7:0]。发送端的第10位为奇偶校验位e,e等于b0^b1^b2^b3^b4^b5^b6^b7,接收机可根据接收到的b[7:0]与e的关系判断是否发生了数据传输错误。发送数据的最后一位为固定的1,确保空闲状态下txd端口为1。

2.接收机端口定义

(1)rxd:接收数据端口

(2)rst_n: 同步复位端,低有效。

(3)rcv_en:接收使能信号,高有效。

(4)b[7:0]: 接收数据。

(5)rcv_ok: 接收正确的标志。每次接收开始时清0,接收到校验位e后,根据运算决定输出,1表示正确,0表示错误。

(6)rcv_st:接收状态。1表示正在接收过程中,b[7:0]不可用,0表示已完成接收,b[7:0]可用。

3.设计环境

(1)所有输出端负载为0.1PF。

(2)所有输入信号内阻为1k。

(3)所有输入信号上升、下降时间不超过2ns。

(4)rcv_en端输入延迟为时钟周期的20%。

(5)输出延迟为时钟周期的30%。

4.答题要求

(1)设计代码

(2)验证代码,包括正确的和有接收错误的。

(4)状态机和数据通道图。

(5)仿真结果

(6)逻辑综合脚本

(7)版图

尝试了修改latch 块,但改完功能受影响;
求助各位大神,怎么解决而影响功能呀

我写的verilog代码如下:



//2014-06-22

module tg(b,a,y);

input a;

input b;

output y;

reg y;


always@(a or b)

if(a==1'b1)

y=b;

else

y=1'b1;

endmodule

//----------------------------------------------------------------------------------------------------------------

module det(din,clk,rst_n,en,neg);

input din;

input clk;

input rst_n;

input en;

output neg;

reg q1;

reg q2;

reg neg;

always @(posedge clk)

begin

q1<=din;

q2<=q1 ;

if(rst_n==1'b0 )

neg<=0;

else if(en==1'b0 && din==1'b0)

neg<=q1^q2;

else

neg<=0;

end


endmodule

//---------------------------------------------------------------------------------------------------------

module latch(clk,clr,y);

input clk;

input clr;

output y;

//--------------------

reg y;

reg x;

//--------------------

always@(negedge clr)

if(clr==1'b0)

y<=1'b0;

//------------------------

always@(clk)

begin

x=1'b1;

if(clk==1'b1)

y=x;

end

endmodule


//-----------------------------------------------------------------------------------------------------------

module dff(data,clk,clr,q);

input data;

input clk;

input clr;

output q;


reg q;


always@(posedge clk or posedge clr )

if(clr==1'b1)

q<=1'b0;

else

q<=data;

endmodule

//-------------------------------------------------------------------------------------------------------

module cnt16(clk,clr,ena,co);

input clk;

input clr;

input ena;

output co;


reg co;

reg [3:0]q;


always@(posedge clk or negedge clr)

begin

if(clr==1'b0)

q<=4'h0;

else if(ena==1'b1)

if (q==4'b1111)

q<=4'b0000;

else q<=q+1'b1;

end


always@(q)

begin

if(q==4'b1111)

co=4'h1;

else

co=4'h0;

end

endmodule

//--------------------------------------------------------------------------------------------------------

module cnt11(clk,clr,ena,q,co);

input clk;

input clr;

input ena;

output [3:0]q;

output co;


reg [3:0]q;

reg co;


always@(posedge clk or negedge clr)

begin

if(clr==1'b0)

q<=4'h0;

else if(ena==1'b1)

if (q==4'b1010)

q<=4'b0000;

else q<=q+1'b1;

end


always@(q)

begin

if(q==4'b1010)

co=4'h1;

else

co=4'h0;

end

endmodule

//-----------------------------------------------------------------------------------------------------------

module receiver_fsm(clk,rst_n,x1,neg,rcv_st,q1,q2);

input clk;

input rst_n;

input [3:0] x1;

input neg;

output rcv_st;

output q1;

output q2;

//---------------

reg rcv_st;

reg q1;

reg q2;

reg [2:0]cs;

reg [2:0]ns;

//---------------------

parameter idle =3'b000;

parameter st1=3'b001;

parameter st2=3'b010;

parameter st3=3'b011;

parameter st4=3'b100;

parameter st5=3'b101;

//---------------------

always@(posedge clk)

if(rst_n==1'b0)

cs <=idle;

else

cs <=ns;

//---------------------------------------

always@(cs or x1 or neg)

case(cs)

idle:

begin

{rcv_st,q1,q2}=3'b000;

if(x1==4'b0000)

ns=st1;

end

st1:

begin

{rcv_st,q1,q2}=3'b001;

if(x1==4'b0000)

ns=st1;

else if(4'b0001<=x1<=4'b0111)

ns=st2;

end

st2:

begin

{rcv_st,q1,q2}=3'b101;

if(x1==4'b1000)

ns=st3;

end

st3:

begin

{rcv_st,q1,q2}=3'b100;

if(x1==4'b1001)

ns=st4;

end

st4:

begin

{rcv_st,q1,q2}=3'b110;

if(x1==4'b1010)

ns=st5;

end

st5:

begin

{rcv_st,q1,q2}=3'b010;

if(neg==1'b1)

ns=idle;

end

endcase


endmodule


//-----------------------------------------------------------------------------------------------

module s2p (sdata,clk,rst_n,en1,en2,in1,out,pdata);

output [7:0] pdata;

output out;

input sdata,clk,rst_n,en1;

input en2,in1;

reg out;

reg [7:0] pdata;

reg [7:0] p_reg;

//---------------------------------------

always @(posedge clk or negedge rst_n)

if (rst_n==1'b0)

begin

pdata <=8'h00;

end

else if(en1==1)

begin

pdata[7:0]<=8'hzz;

p_reg[7:1]<=p_reg [6:0];

p_reg[0]<=sdata;

end

else if(en1==1'b0)

begin

pdata<=p_reg;

end

//----------------------------------------------

always@(en2 or in1 or p_reg)

if(en2==1'b0)

out=1'b0;

else

out=in1^~yh(p_reg);

functionyh;

input[7:0] a;

integer i;

begin

yh=a[0];

for (i=1;i<8;i=i+1)

begin

yh=yh^a;

end

end

endfunction

//--------------------------------------

endmodule

//------------------------------------------------------------------------------------------------------

module receiver2(rxd,rst_n,rcv_en,clk,b8bit,rcv_ok,rcv_st);

input rxd;

input rst_n;

input rcv_en;

input clk;

output [7:0] b8bit;

output rcv_ok;

output rcv_st;


//---------------------------

wire s0,s1,s2,s3,s4,s5,s7,s8,s10;

wire [3:0]s6;

reg [2:0]cs,ns;

//-----------------------------

parameter idle=3'b000;

parameter st1=3'b001;

parameter st2=3'b010;

parameter st3=3'b011;

parameter st4=3'b100;

//----------------------------

tg u1(.b(rcv_st),.a(rcv_en),.y(s0));

det u2(.din(rxd),.clk(clk),.rst_n(rst_n),.en(s0),.neg(s1));

latch u3(.clk(s1),.clr(s2),.y(s3));

latch u3_1(.clk(s10),.clr(s1),.y(rcv_ok));

dff u4(.data(rxd),.clk(s4),.clr(s1),.q(s5));

cnt16 u5(.clk(clk),.clr(rst_n),.ena(s3),.co(s4));

cnt11 u6(.clk(s4),.clr(rst_n),.ena(s3),.q(s6),.co(s2));

receiver_fsm u7(.clk(clk),.rst_n(rst_n),.x1(s6),.neg(s1),.rcv_st(rcv_st),.q1(s8),.q2(s7));

s2p u9(.sdata(rxd),.clk(s4),.rst_n(rst_n),.en1(s7),.en2(s8),.in1(s5),.out(s10),.pdata(b8bit));

//---------------------------------------------------------------------------------------------------------

endmodule



测试代码如下

module receiver2_tb();reg rxd;reg rst_n;reg rcv_en;reg clk;wire [7:0] b8bit;wire rcv_ok;wire rcv_st;//-----------------------------receiver2 u0(.rxd(rxd),.rst_n(rst_n),.rcv_en(rcv_en),.clk(clk),.b8bit(b8bit),.rcv_ok(rcv_ok),.rcv_st(rcv_st));//-----------------------task half_pulse;inout clock;#2.5clock = ~ clock;endtask//----------------------------------------------------------------------------task pulse;input[31:0] num;integer i;for(i=0;i<num;i=i+1)beginhalf_pulse(clk);half_pulse(clk);endendtask//-------------------------------initial beginrst_n=1'b0;rcv_en=1'b1;clk=1'b0;rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;rst_n=1'b1;#95rxd=1'b0;//begin bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;//e bit#95rxd=1'b1;//end bit#95 rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//12 bite 1#95rxd=1'b0;//begin bit#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;//e bit#95rxd=1'b1;//end bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//12 bite 1#95rxd=1'b0;//begin bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;//e bit#95rxd=1'b1;//end bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//12 bite 1#95rxd=1'b0;//begin bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;//e bit#95rxd=1'b1;//end bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//12 bite 1#95rxd=1'b0;//begin bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//e bit#95rxd=1'b1;//end bitend//--------------------initial pulse(50000000);//-----------------------endmodule

用DC编译时报错如下图



脚本文件如下

#------------------------------------------------------------------------------# File: A TCL format DC script file # Author : xinxn # date: 2010-08-04#------------------------------------------------------------------------------set TECH_LIB_PATH"/iclibs/CSMCBCD05/synopsys"set SYMBOL_LIB_PATH "/iclibs/CSMCBCD05/icons"set CORE_LIB"IC05CScore_50_typbcdv10.db"set IO_LIB"IC05CSpad_50_typbcdv10.db"#------------------------------------------------------------------------------set search_path [concat $TECH_LIB_PATH $search_path]set search_path [concat $SYMBOL_LIB_PATH $search_path]echo $search_path#------------------------------------------------------------------------------set target_library {IC05CScore_50_typbcdv10.db}set link_library {* IC05CScore_50_typbcdv10.db IC05CSpad_50_typbcdv10.db}set symbol_library {IC05CScore.sdb}#------------------------------------------------------------------------------# add DesignWare Libs to link library#------------------------------------------------------------------------------set SYN_LIB {dw_foundation.sldb}lappend link_library $SYN_LIB#------------------------------------------------------------------------------#------------------------------------------------------------------------------set WORK_DIR /home/socusr/dcset THIS_DESIGN receiver2#------------------------------------------------------------------------------# reports path and file#------------------------------------------------------------------------------set SETUP_RPT_FILE $WORK_DIR/report/setup_time.rptset HOLD_RPT_FILE$WORK_DIR/report/hold_time.rptset AREA_RPT_FILE$WORK_DIR/report/area.rptset CELL_RPT_FILE$WORK_DIR/report/cell.rptset POWER_RPT_FILE $WORK_DIR/report/power.rptset VIOL_FILE$WORK_DIR/report/voilation.rpt#----------------------------------------------------------------------------------set NETLIST_FILE$WORK_DIR/netlist/receiver2_gate.vset SDC_FILE$WORK_DIR/sdc/receiver2.sdc#----------------------------------------------------------------------------------set CLK_PER 5set IN_DLY [expr $CLK_PER * 0.2]set OUT_DLY [expr $CLK_PER * 0.3]set MAX_TRANSITION 0.1#----------------------------------------------------------------------------------read_verilog $WORK_DIR/code/receiver2.vcurrent_design $THIS_DESIGNlinkcheck_design#----------------------------------------------------------------------------------set ALL_EX_CLK [remove_from_collection [all_inputs] [get_ports clk]]#----------------------------------------------------------------------------------# design rules constrAInts#----------------------------------------------------------------------------------# set driving ability of input ports and load of output ports.#----------------------------------------------------------------------------------set_drive 1.0 $ALL_EX_CLKset_drive 0 [get_ports clk]set_load0.1 [all_outputs]#----------------------------------------------------------------------------------set auto_wire_load_selection trueset_max_transition $MAX_TRANSITION $THIS_DESIGNset_max_fanout 6 $ALL_EX_CLKset_max_fanout 2 [get_ports rst_n] #-----------------------------------------------------------------------------------# Timing constraints#-----------------------------------------------------------------------------------create_clock -p $CLK_PER -name CLK [get_ports clk]set_clock_latency 1.0 [get_clocks CLK]set_clock_uncertainty -setup 0.1 CLKset_clock_uncertainty -hold 0.1 CLKset_input_delay -max $IN_DLY -clock CLK $ALL_EX_CLK set_input_delay -min 0.5 -clock CLK $ALL_EX_CLKset_output_delay $OUT_DLY [all_outputs]#-----------------------------------------------------------------------------------report_port #-----------------------------------------------------------------------------------set_dont_touch_network [get_clocks CLK]uniquifyset_max_area 0compile -map_effort high#-----------------------------------------------------------------------------------report_constraint -all_violators > $VIOL_FILE#-----------------------------------------------------------------------------------report_timing > $SETUP_RPT_FILEreport_timing -delay min > $HOLD_RPT_FILE#-----------------------------------------------------------------------------------report_cell>$CELL_RPT_FILEreport_area>$AREA_RPT_FILEreport_power >$POWER_RPT_FILE#-----------------------------------------------------------------------------------#-----------------------------------------------------------------------------------write -format verilog -hier -o $NETLIST_FILEwrite_sdc -nosplit $SDC_FILE#quit

尝试了修改latch 块,但改完功能受影响;


求助各位大神,怎么解决而影响功能呀




Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top