微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 请问:下面异步复位赋值与一个输入有关的模块,在综合后的仿真出

请问:下面异步复位赋值与一个输入有关的模块,在综合后的仿真出

时间:12-11 整理:3721RD 点击:
综合后的仿真,当rst_n=0时,A[20]可以正常复位,但是当rst_n由0变为1之后,A[20]就会出现不定态,直到LE上升沿到来给它赋值.
附件是综合后的仿真结果和DFFSR的真值表.
这种仿真结果会在实际中发生吗?
该怎样改代码才能避免?
行为级网表,其中A[20]在复位的时候与输入MODE有关.
module  REG0         (DATA,
                       LE,
                       SEL_C,
                       rst_n,//active low
                       MODE,
                       A);
input   [28:0] DATA;    wire [28:0]     DATA ;
input   LE;             wire            LE ;
input   SEL_C;          wire            SEL_C ;
input   rst_n ;         wire            rst_n ;
input   MODE ;          wire            MODE ;
output  [28:0] A;       reg [28:0]      A;
//synopsys async_set_reset "rst_n"
always @(posedge LE or negedge rst_n)
begin
  if(!rst_n)
    A <= {8'b11111111,MODE,4'b1100,16'b0000_0000_0000_0000}  ;
  else if(SEL_C)
    A <= DATA;
end
endmodule
综合后的相关的门级网表
DFFSRXL A_reg_20_ ( .D(n28), .CK(LE), .SN(n7), .RN(n1), .Q(A[20]) );
INVX8 U30 ( .A(n2), .Y(n1) );
INVX1 U31 ( .A(rst_n), .Y(n2) );
NAND2X1 U32 ( .A(MODE), .B(n2), .Y(n7) );
MX2X1 U21 ( .S0(SEL_C), .B(DATA[20]), .A(A[20]), .Y(n28) );

这张图是n1 和n7在rst_n由0变到1之后它们之间的延迟,
不定态会不会就是由于这个原因造成的?

应该是在和rst_n 0->1的时候,
n1/n7对应于SN和RN的竞争冒险有关,去查一下vendor库,关于SN,RN的约束
SN,RN应该有一定的时序要求.
如果在前段没有保证,需要在后端加以保证,
问题出在,你的reset里面有变量.

这个就是时序约束关系吗?
是哪条不满足?
在后端怎么加以保证?
关键是我需要在reset里面有变量,因为应用需要上电复位后就工作,而不写寄存器字.

1)在前段仿真可以给n1,n7加上一个时序延时例如2ns
  然后,要求后端工程师在layout的时候,保持n1,n7的时序要求.
  后端,告诉,后端工程师,该cell的RN,SN时序关系就可以了.
2)在前端避免这个问题
  既然你的复位逻辑中,包含有变量,应该使用同步复位,而不是异步复位.

后端应该会给n7继续插buffer/INV后再用做RN,满足RN和SN之间的时序要求

mode分在别的always语句里面写
单独出来就可以的
这样会导致竞争冒险的

1,定义一组输入PAD,假设为MODE,直接通过电路板上的跳线,每位可以设置1还是0;
一旦在上电前设定,上电后就不能改变。
2,定义一个寄存器A,上电后初始化为0。仅仅在reset后第一个周期,可以锁存MODE的
值;此后A中MODE的值不能改变。你的A就一直包涵MODE的值了。

这样的code怎么写?
我分来分去好象综合的结果都一样.

我对N7插了2个buf,大约比N1延迟2ns后问题解决.

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

网站地图

Top