|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
arm的memory仿真模型内部WEN_int信号对WEN的采样,前仿正确,综合后仿真错误。综合后的代码WEN寄存器如果改回行为级就没问题(见综合后代码标红部分)
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 |
|