在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4543|回复: 9

[求助] 一个综合后仿真问题

[复制链接]
发表于 2014-10-24 13:21:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
arm的memory仿真模型内部WEN_int信号对WEN的采样,前仿正确,综合后仿真错误。综合后的代码WEN寄存器如果改回行为级就没问题(见综合后代码标红部分)

WEN_int正确波形:

WEN_int正确波形

WEN_int正确波形


WEN_int错误波形:

WEN_int错误波形

WEN_int错误波形


由于WEN是CLK_驱动的,所以不理解为何会在CLK_上升延采样为高
请大神赐教

RTL代码:
module tx_ram_rf2shd_40x256(
    output  [39:0]  QA,
    input           CLKA,
    input           CENA,
    input   [7:0]   AA,
    input           CLKB,
    input           CENB,
    input   [7:0]   AB,
    input   [39:0]  DB,
    input           rst_n
);

// tx fifo,
// CLKB is DDR clk
    wire    [7:0]   A;
    wire            CEN;
    reg             WEN;
    reg     [39:0]  QA;
    wire    [39:0]  fast_QA;
    reg             fast_CENA;
    reg     [7:0]   fast_AA;
    reg             CENA_r,CENA_d;

    assign  A   = WEN? fast_AA : AB;
    assign  CEN = WEN? fast_CENA : CENB;

    always@(posedge CLKB)
    begin
        if(~rst_n)
            WEN <= 1'b1;
        else
            WEN <= ~WEN;
    end

    always@(posedge CLKB)
    begin
        if(~rst_n)
        begin
            CENA_r <= 1'b1;
            CENA_d <= 1'b1;
        end
        else
        begin
            CENA_r <= CENA;
            CENA_d <= CENA_r;
        end
    end

    always@(posedge CLKB)
    begin
        if(~rst_n)
        begin
            fast_AA <= 0;
            fast_CENA <= 1;
        end
        else if(CENA_r==1'b0 && CENA_d==1'b1)
        begin
            fast_AA <= AA;
            fast_CENA <= 1'b0;
        end
        else if(WEN==1'b1)
            fast_CENA <= 1'b1;
    end

    always@(posedge CLKB)
    begin
        if(~rst_n)
            QA <= 0;
        else if(CENA_r==1'b0 && CENA_d==1'b0 && fast_CENA==1'b1)
            QA <= fast_QA;
    end

    sprf_40x256 txfifo_40x256 (
        .Q(fast_QA),
        .CLK(CLKB),
        .CEN(CEN),
        .WEN(WEN),
        .A(A),
        .D(DB),
        .EMA(3'b010),
        .EMAW(2'b00),
        .FMS(4'b1100),
        .WAWL(1'b0),
        .WAWLM(2'b00),
        .RET1N(1'b1)
    );

endmodule


综合后代码:
module tx_ram_rf2shd_40x256 ( QA, CLKA, CENA, AA, CLKB, CENB, AB, DB, rst_n
);
  output [39:0] QA;
  input [7:0] AA;
  input [7:0] AB;
  input [39:0] DB;
  input CLKA, CENA, CLKB, CENB, rst_n;
  wire   n_Logic1_, n_Logic0_, WEN, CEN, CENA_d, CENA_r, n4, n5, n6, n7, n8,
         n9, n10, n11, n12, n13, n14, n15, n16, n17, n18, n19, n20, n21, n22,
         n23, n24, n25, n26, n27, n28, n29, n30, n31, n32, n33, n34, n35, n36,
         n37, n38, n39, n40, n41, n42, n43, n44, n45, n46, n47, n48, n49, n50,
         n51, n52, n53, n54;
  wire   [7:0] A;
  wire   [7:0] fast_AA;
  wire   [39:0] fast_QA;

  sprf_40x256 txfifo_40x256 ( .Q(fast_QA), .A(A), .D(DB), .EMA({n_Logic0_,
        n_Logic1_, n_Logic0_}), .EMAW({n_Logic0_, n_Logic0_}), .FMS({n_Logic1_,
        n_Logic1_, n_Logic0_, n_Logic0_}), .WAWLM({n_Logic0_, n_Logic0_}),
        .CLK(CLKB), .CEN(CEN), .WEN(n11), .WAWL(n_Logic0_), .RET1N(n_Logic1_)
         );
  DFKSNHVTD2 fast_CENA_reg ( .D(n8), .SN(n28), .CP(CLKB), .QN(n5) );
  AOI21HVTD4 U4 ( .A1(n5), .A2(n10), .B(n12), .ZN(n8) );
  MOAI22HVTD1 U6 ( .A1(n10), .A2(n5), .B1(CENB), .B2(n10), .ZN(CEN) );
  AO22HVTD4 U7 ( .A1(n11), .A2(fast_AA[7]), .B1(AB[7]), .B2(n10), .Z(A[7]) );
  AO22HVTD4 U8 ( .A1(n11), .A2(fast_AA[6]), .B1(AB[6]), .B2(n10), .Z(A[6]) );
  AO22HVTD4 U9 ( .A1(n11), .A2(fast_AA[5]), .B1(AB[5]), .B2(n10), .Z(A[5]) );
  AO22HVTD4 U10 ( .A1(n11), .A2(fast_AA[4]), .B1(AB[4]), .B2(n10), .Z(A[4]) );
  AO22HVTD4 U11 ( .A1(n11), .A2(fast_AA[3]), .B1(AB[3]), .B2(n10), .Z(A[3]) );
  AO22HVTD4 U12 ( .A1(n11), .A2(fast_AA[2]), .B1(AB[2]), .B2(n10), .Z(A[2]) );
  AO22HVTD4 U13 ( .A1(n11), .A2(fast_AA[1]), .B1(AB[1]), .B2(n10), .Z(A[1]) );
  AO22HVTD4 U14 ( .A1(n11), .A2(fast_AA[0]), .B1(AB[0]), .B2(n10), .Z(A[0]) );
  EDFKCNQHVTD4 QA_reg_39_ ( .CN(n39), .D(fast_QA[39]), .E(n13), .CP(CLKB), .Q(
        QA[39]) );
  EDFKCNQHVTD4 QA_reg_38_ ( .CN(n38), .D(fast_QA[38]), .E(n13), .CP(CLKB), .Q(
        QA[38]) );
  EDFKCNQHVTD4 QA_reg_37_ ( .CN(n38), .D(fast_QA[37]), .E(n13), .CP(CLKB), .Q(
        QA[37]) );
  EDFKCNQHVTD4 QA_reg_36_ ( .CN(n38), .D(fast_QA[36]), .E(n13), .CP(CLKB), .Q(
        QA[36]) );
  EDFKCNQHVTD4 QA_reg_35_ ( .CN(n38), .D(fast_QA[35]), .E(n13), .CP(CLKB), .Q(
        QA[35]) );
  EDFKCNQHVTD4 QA_reg_34_ ( .CN(n37), .D(fast_QA[34]), .E(n14), .CP(CLKB), .Q(
        QA[34]) );
  EDFKCNQHVTD4 QA_reg_33_ ( .CN(n37), .D(fast_QA[33]), .E(n14), .CP(CLKB), .Q(
        QA[33]) );
  EDFKCNQHVTD4 QA_reg_32_ ( .CN(n37), .D(fast_QA[32]), .E(n14), .CP(CLKB), .Q(
        QA[32]) );
  EDFKCNQHVTD4 QA_reg_31_ ( .CN(n37), .D(fast_QA[31]), .E(n14), .CP(CLKB), .Q(
        QA[31]) );
  EDFKCNQHVTD4 QA_reg_30_ ( .CN(n36), .D(fast_QA[30]), .E(n14), .CP(CLKB), .Q(
        QA[30]) );
  EDFKCNQHVTD4 QA_reg_29_ ( .CN(n36), .D(fast_QA[29]), .E(n15), .CP(CLKB), .Q(
        QA[29]) );
  EDFKCNQHVTD4 QA_reg_28_ ( .CN(n36), .D(fast_QA[28]), .E(n15), .CP(CLKB), .Q(
        QA[28]) );
  EDFKCNQHVTD4 QA_reg_27_ ( .CN(n36), .D(fast_QA[27]), .E(n15), .CP(CLKB), .Q(
        QA[27]) );
  EDFKCNQHVTD4 QA_reg_26_ ( .CN(n35), .D(fast_QA[26]), .E(n15), .CP(CLKB), .Q(
        QA[26]) );
  EDFKCNQHVTD4 QA_reg_25_ ( .CN(n35), .D(fast_QA[25]), .E(n15), .CP(CLKB), .Q(
        QA[25]) );
  EDFKCNQHVTD4 QA_reg_24_ ( .CN(n35), .D(fast_QA[24]), .E(n16), .CP(CLKB), .Q(
        QA[24]) );
  EDFKCNQHVTD4 QA_reg_23_ ( .CN(n35), .D(fast_QA[23]), .E(n16), .CP(CLKB), .Q(
        QA[23]) );
  EDFKCNQHVTD4 QA_reg_22_ ( .CN(n34), .D(fast_QA[22]), .E(n16), .CP(CLKB), .Q(
        QA[22]) );
  EDFKCNQHVTD4 QA_reg_21_ ( .CN(n34), .D(fast_QA[21]), .E(n16), .CP(CLKB), .Q(
        QA[21]) );
  EDFKCNQHVTD4 QA_reg_20_ ( .CN(n34), .D(fast_QA[20]), .E(n16), .CP(CLKB), .Q(
        QA[20]) );
  EDFKCNQHVTD4 QA_reg_19_ ( .CN(n33), .D(fast_QA[19]), .E(n17), .CP(CLKB), .Q(
        QA[19]) );
  EDFKCNQHVTD4 QA_reg_18_ ( .CN(n33), .D(fast_QA[18]), .E(n17), .CP(CLKB), .Q(
        QA[18]) );
  EDFKCNQHVTD4 QA_reg_17_ ( .CN(n33), .D(fast_QA[17]), .E(n17), .CP(CLKB), .Q(
        QA[17]) );
  EDFKCNQHVTD4 QA_reg_16_ ( .CN(n33), .D(fast_QA[16]), .E(n17), .CP(CLKB), .Q(
        QA[16]) );
  EDFKCNQHVTD4 QA_reg_15_ ( .CN(n32), .D(fast_QA[15]), .E(n17), .CP(CLKB), .Q(
        QA[15]) );
  EDFKCNQHVTD4 QA_reg_14_ ( .CN(n32), .D(fast_QA[14]), .E(n18), .CP(CLKB), .Q(
        QA[14]) );
  EDFKCNQHVTD4 QA_reg_13_ ( .CN(n32), .D(fast_QA[13]), .E(n18), .CP(CLKB), .Q(
        QA[13]) );
  EDFKCNQHVTD4 QA_reg_12_ ( .CN(n32), .D(fast_QA[12]), .E(n18), .CP(CLKB), .Q(
        QA[12]) );
  EDFKCNQHVTD4 QA_reg_11_ ( .CN(n34), .D(fast_QA[11]), .E(n18), .CP(CLKB), .Q(
        QA[11]) );
  EDFKCNQHVTD4 QA_reg_10_ ( .CN(n31), .D(fast_QA[10]), .E(n18), .CP(CLKB), .Q(
        QA[10]) );
  EDFKCNQHVTD4 QA_reg_9_ ( .CN(n31), .D(fast_QA[9]), .E(n19), .CP(CLKB), .Q(
        QA[9]) );
  EDFKCNQHVTD4 QA_reg_8_ ( .CN(n31), .D(fast_QA[8]), .E(n19), .CP(CLKB), .Q(
        QA[8]) );
  EDFKCNQHVTD4 QA_reg_7_ ( .CN(n30), .D(fast_QA[7]), .E(n19), .CP(CLKB), .Q(
        QA[7]) );
  EDFKCNQHVTD4 QA_reg_6_ ( .CN(n30), .D(fast_QA[6]), .E(n19), .CP(CLKB), .Q(
        QA[6]) );
  EDFKCNQHVTD4 QA_reg_5_ ( .CN(n30), .D(fast_QA[5]), .E(n19), .CP(CLKB), .Q(
        QA[5]) );
  EDFKCNQHVTD4 QA_reg_4_ ( .CN(n30), .D(fast_QA[4]), .E(n20), .CP(CLKB), .Q(
        QA[4]) );
  EDFKCNQHVTD4 QA_reg_3_ ( .CN(n29), .D(fast_QA[3]), .E(n20), .CP(CLKB), .Q(
        QA[3]) );
  EDFKCNQHVTD4 QA_reg_2_ ( .CN(n29), .D(fast_QA[2]), .E(n20), .CP(CLKB), .Q(
        QA[2]) );
  EDFKCNQHVTD4 QA_reg_1_ ( .CN(n29), .D(fast_QA[1]), .E(n20), .CP(CLKB), .Q(
        QA[1]) );
  EDFKCNQHVTD4 QA_reg_0_ ( .CN(n31), .D(fast_QA[0]), .E(n20), .CP(CLKB), .Q(
        QA[0]) );
  EDFKCNQHVTD1 fast_AA_reg_7_ ( .CN(rst_n), .D(AA[7]), .E(n12), .CP(CLKB), .Q(
        fast_AA[7]) );
  EDFKCNQHVTD1 fast_AA_reg_6_ ( .CN(rst_n), .D(AA[6]), .E(n12), .CP(CLKB), .Q(
        fast_AA[6]) );
  EDFKCNQHVTD1 fast_AA_reg_5_ ( .CN(rst_n), .D(AA[5]), .E(n12), .CP(CLKB), .Q(
        fast_AA[5]) );
  EDFKCNQHVTD1 fast_AA_reg_4_ ( .CN(rst_n), .D(AA[4]), .E(n12), .CP(CLKB), .Q(
        fast_AA[4]) );
  EDFKCNQHVTD1 fast_AA_reg_3_ ( .CN(rst_n), .D(AA[3]), .E(n12), .CP(CLKB), .Q(
        fast_AA[3]) );
  EDFKCNQHVTD1 fast_AA_reg_2_ ( .CN(rst_n), .D(AA[2]), .E(n12), .CP(CLKB), .Q(
        fast_AA[2]) );
  EDFKCNQHVTD1 fast_AA_reg_1_ ( .CN(rst_n), .D(AA[1]), .E(n12), .CP(CLKB), .Q(
        fast_AA[1]) );
  EDFKCNQHVTD1 fast_AA_reg_0_ ( .CN(rst_n), .D(AA[0]), .E(n12), .CP(CLKB), .Q(
        fast_AA[0]) );
  //DFKSNHVTD2 WEN_reg ( .D(n10), .SN(n28), .CP(CLKB), .Q(WEN), .QN(n4) );
  reg WEN_r;
  always@(posedge CLKB)
      if(~n28)
          WEN_r <= 1'b1;
      else
          WEN_r <= n10;
  assign n4 =~ WEN_r;
  assign WEN = WEN_r;
  DFKSNHVTD2 CENA_r_reg ( .D(CENA), .SN(rst_n), .CP(CLKB), .Q(CENA_r) );
  DFKSNHVTD2 CENA_d_reg ( .D(CENA_r), .SN(rst_n), .CP(CLKB), .Q(CENA_d) );
  NR3HVTD4 U3 ( .A1(CENA_d), .A2(CENA_r), .A3(n5), .ZN(n6) );
  INR2HVTD2 U5 ( .A1(CENA_d), .B1(CENA_r), .ZN(n7) );
  INVHVTD0 U15 ( .I(n4), .ZN(n9) );
  CKNXHVTD4 U16 ( .I(n9), .ZN(n10) );
  TIELHVT U17 ( .ZN(n_Logic0_) );
  TIEHHVT U18 ( .Z(n_Logic1_) );
  BUFFHVTD16 U19 ( .I(WEN), .Z(n11) );
  BUFFHVTD16 U20 ( .I(n7), .Z(n12) );
  CKNXHVTD16 U21 ( .I(n24), .ZN(n13) );
  CKNXHVTD16 U22 ( .I(n24), .ZN(n14) );
  CKNXHVTD16 U23 ( .I(n23), .ZN(n15) );
  CKNXHVTD16 U24 ( .I(n23), .ZN(n16) );
  CKNXHVTD16 U25 ( .I(n22), .ZN(n17) );
  CKNXHVTD16 U26 ( .I(n22), .ZN(n18) );
  CKNXHVTD16 U27 ( .I(n21), .ZN(n19) );
  CKNXHVTD16 U28 ( .I(n21), .ZN(n20) );
  CKNXHVTD12 U29 ( .I(n26), .ZN(n21) );
  CKNXHVTD12 U30 ( .I(n26), .ZN(n22) );
  CKNXHVTD12 U31 ( .I(n25), .ZN(n23) );
  CKNXHVTD12 U32 ( .I(n25), .ZN(n24) );
  CKNXHVTD12 U33 ( .I(n27), .ZN(n25) );
  CKNXHVTD12 U34 ( .I(n27), .ZN(n26) );
  CKNXHVTD16 U35 ( .I(n6), .ZN(n27) );
  BUFFHVTD16 U36 ( .I(n46), .Z(n28) );
  BUFFHVTD16 U37 ( .I(n45), .Z(n29) );
  BUFFHVTD16 U38 ( .I(n45), .Z(n30) );
  BUFFHVTD16 U39 ( .I(n44), .Z(n31) );
  BUFFHVTD16 U40 ( .I(n44), .Z(n32) );
  BUFFHVTD16 U41 ( .I(n43), .Z(n33) );
  BUFFHVTD16 U42 ( .I(n43), .Z(n34) );
  BUFFHVTD16 U43 ( .I(n42), .Z(n35) );
  BUFFHVTD16 U44 ( .I(n42), .Z(n36) );
  BUFFHVTD16 U45 ( .I(n41), .Z(n37) );
  BUFFHVTD16 U46 ( .I(n41), .Z(n38) );
  BUFFHVTD16 U47 ( .I(n40), .Z(n39) );
  BUFFHVTD16 U48 ( .I(n50), .Z(n40) );
  BUFFHVTD16 U49 ( .I(n49), .Z(n41) );
  BUFFHVTD16 U50 ( .I(n49), .Z(n42) );
  BUFFHVTD16 U51 ( .I(n48), .Z(n43) );
  BUFFHVTD16 U52 ( .I(n48), .Z(n44) );
  BUFFHVTD16 U53 ( .I(n47), .Z(n45) );
  BUFFHVTD16 U54 ( .I(n47), .Z(n46) );
  BUFFHVTD16 U55 ( .I(n52), .Z(n47) );
  BUFFHVTD16 U56 ( .I(n52), .Z(n48) );
  BUFFHVTD16 U57 ( .I(n51), .Z(n49) );
  BUFFHVTD16 U58 ( .I(n51), .Z(n50) );
  BUFFHVTD16 U59 ( .I(n53), .Z(n51) );
  BUFFHVTD16 U60 ( .I(n53), .Z(n52) );
  CKNXHVTD16 U61 ( .I(n54), .ZN(n53) );
  CKNXHVTD16 U62 ( .I(rst_n), .ZN(n54) );
endmodule


附件为arm artisan的memory仿真模型。
与WEN_int有关代码如下:
always @ CLK_ begin
// If POWER_PINS is defined at Simulator Command Line, it selects the module definition with Power Ports
  if (RET1N_ == 1'b0) begin
      // no cycle in retention mode
  end else begin
    if ((CLK_ === 1'bx || CLK_ === 1'bz) && RET1N_ !== 1'b0) begin
      failedWrite(0);
        Q_int = {52{1'bx}};
    end else if (CLK_ === 1'b1 && LAST_CLK === 1'b0) begin
      CEN_int = CEN_;
      EMA_int = EMA_;
      EMAW_int = EMAW_;
      FMS_int = FMS_;
      WAWL_int = WAWL_;
      WAWLM_int = WAWLM_;
      RET1N_int = RET1N_;
      if (CEN_int != 1'b1) begin
        WEN_int = WEN_;
        A_int = A_;
        D_int = D_;
      end
      clk0_int = 1'b0;
      CEN_int = CEN_;
      EMA_int = EMA_;
      EMAW_int = EMAW_;
      FMS_int = FMS_;
      WAWL_int = WAWL_;
      WAWLM_int = WAWLM_;
      RET1N_int = RET1N_;
      if (CEN_int != 1'b1) begin
        WEN_int = WEN_;
        A_int = A_;
        D_int = D_;
      end
      clk0_int = 1'b0;
    readWrite;
    end else if (CLK_ === 1'b0 && LAST_CLK === 1'b1) begin
    end
  end
    LAST_CLK = CLK_;
  end

相关帖子

发表于 2014-10-24 13:37:53 | 显示全部楼层
时序问题吧,dff std cell 模型里面应该有specfy 之类的延迟。
 楼主| 发表于 2014-10-24 13:48:11 | 显示全部楼层
回复 2# A1985

谢谢你的回复
我这个是没有加延时的仿真
delay_mode_zero
notimingcheck
nospecify都加了


另外标准单元里有个tsmc_dff是个元语吗?内部实现没有找到
发表于 2014-10-24 13:57:49 | 显示全部楼层
回复 3# zero6872


   感觉像delta 延迟引起的问题。一个行为级是非柱塞,例化的党员肯定是阻塞的。木钱只能从语法和波形上看到。
 楼主| 发表于 2014-10-24 14:05:28 | 显示全部楼层
回复 4# A1985

例化的单元一定是阻塞赋值吗?也就是说门级的仿真那些buf之类的元语都是阻塞的?如果是这样倒是可以理解,因为memory模型中也是阻塞赋值,这样就会有事件先后的问题。
但是如果是这样,是否就是说memory模型有很大的问题?
发表于 2014-10-24 14:17:27 | 显示全部楼层
本帖最后由 A1985 于 2014-10-24 14:18 编辑

回复 5# zero6872


   例化的单元等价于assign,模型不是问题所在,在于你啊,干嘛综合后仿真。。呵呵,没有太大意义,如果加入延迟就没有问题了。。。错的在你
 楼主| 发表于 2014-10-24 14:20:24 | 显示全部楼层
回复 6# A1985

谢谢指教~
发表于 2016-4-17 20:09:28 | 显示全部楼层
rom瞎子啊
发表于 2016-4-17 20:10:06 | 显示全部楼层
数据综合与逻辑
发表于 2018-4-23 20:55:18 | 显示全部楼层
楼主哥哥,这个问题后来怎么解决的?我现在是前仿和formality都过了,但是后仿不带时序的好像SOC进不去仿真主程序,我也是用了很多mem,感觉和你的mem仿真模型很像,应该你也是UMC的吧?或者ARMTISEN产生的模型都这样?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-5 09:59 , Processed in 0.031217 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表