blob: 398df18a5a0fe15e9e35da59193bf976fe4d005e [file] [log] [blame]
// ================================================
// Copyright 2013, Cypress Semiconductor Corporation.
//
// This software is owned by Cypress Semiconductor Corporation (Cypress)
// and is protected by United States copyright laws and international
// treaty provisions. Therefore, you must treat this software like any
// other copyrighted material (e.g., book, or musical recording), with
// the exception that one copy may be made for personal use or
// evaluation. Reproduction, modification, translation, compilation, or
// representation of this software in any other form (e.g., paper,
// magnetic, optical, silicon, etc.) is prohibited without the express
// written permission of Cypress.
//
// Disclaimer: Cypress makes no warranty of any kind, express or implied,
// with regard to this material, including, but not limited to, the
// implied warranties of merchantability and fitness for a particular
// purpose. Cypress reserves the right to make changes without further
// notice to the materials described herein. Cypress does not assume any
// liability arising out of the application or use of any product or
// circuit described herein. Cypress' products described herein are
// not authorized for use as components in life-support devices.
//
// This software is protected by and subject to worldwide patent
// coverage, including U.S. and foreign patents. Use may be limited by
// and subject to the Cypress Software License Agreement.
//
// ===============================================
// File : $File: //depot/icm/proj/s8fmlt/icmrel/ipVault/opus/s8fmlt/s8fmlt_32k_sys/behavioral/verilog.v $
// Author : Iustin Ignatescu (IXI)
// Date : 09/2012
// $Revision: 1 $
// ===============================================
// Description: this the system level behavioral model for the s8fmlt_32k_sys
// flash macro. This is a stand alone model which models the entire system including
// pump, iref, vdac logic previously modeled in separate blocks
//----------------------------------------------------------------------
`timescale 1ns/1ps
module s8fmlt_32k_sys ( amuxbusa, amuxbusb, dout, scan_out1, scan_out2,
`ifdef USE_PG_PIN
vpwri_fm,
`endif
xy_out, axa, bdac, ca, cdac, clk, di, idac, iref, iso, mdac, mode, ndac,
pa, pclk, pd1, pd2, pdac, pe, pnb, pw, ra, reset, scan_en, scan_in1, scan_in2,
scan_mode, sdac, seq, sleep, tm, turbo_b, itimo_nvl, VPOS, VNEG, VMARG_AUX,
`ifdef USE_PG_PIN
vccd, vgnd, vnb, vpb, vpb_sw,
`endif
vref );
parameter CODEFILE = "s8fmlt_32k.rom" ;
//----------------------------------------------------------------------------------------------------
// configuratioon parameters
localparam AADDR_BITS = 1; // special sector select bit - axa
localparam BADDR_BITS = 0; // no ba address bits
localparam RADDR_BITS = 8; // 512 rows in one sector one plane
localparam CADDR_BITS = 4; // 16 columns
localparam DADDR_BITS = 0; // Da bus not used in 64k lite
localparam PADDR_BITS = 7; // 128x8bit latches
localparam SRADDR_BITS = 3; // number of bits required to address a special row in a special sector - 8 special rows
localparam SBADDR_BITS = 0; //number of ba bits required to address one special sector
localparam ADDR_BITS = AADDR_BITS+BADDR_BITS+RADDR_BITS+CADDR_BITS; //ba is 0 for 64k lite
localparam PLADDR_BITS = 0; // Bits required to decode the plane. One plane in 64k lite
localparam TADDR_BITS = 5; // new implementation of test mode select
localparam SEQ_SIZE = 2; // sequence bus size
localparam MODE_SIZE = 4; // mode bus size
localparam DI_SIZE = 8; // input size
localparam DO_SIZE = 64; // output size
localparam READ = 4'b0000; // read mode
localparam PREPRG = 4'b0001; // preprogram mode
localparam PWRALL = 4'b0010; // page write all
localparam PS_IDLE = 4'b0011; // Pseudo idle mode
localparam CLR_PAGE = 4'b0100; // clear page latches mode
localparam RSTHV = 4'b0101; // reset hv mode
localparam ERS_BK = 4'b1001; // erase bulk
localparam ERS_SC = 4'b1010; // erase sector mode; not used in 64k lite
localparam ERS_WL = 4'b1011; // erase sub-sector mode
localparam PRG_BK_ALL = 4'b1100; // program bulk all rows
localparam PRG_BK = 4'b1101; // program bulk (odd or even rows)
localparam PRG_SC = 4'b1110; // program sector (odd or even rows); not used in 64k lite
localparam PRG_WL = 4'b1111; // program word line
localparam MEM_SIZE = 2**ADDR_BITS ; // memory size is 2 to the address size
localparam COLUMNS = 2**CADDR_BITS ; // number of "do's" on a row;
localparam PAGE_SIZE = 2**PADDR_BITS ; // number of page latces; also number of di's on a row
localparam SPEC_SECTOR_ROWS = 2**SRADDR_BITS;
localparam SECTOR_ROWS = 2**RADDR_BITS;
localparam SECTORS = 2**BADDR_BITS;
localparam SPEC_SECTORS = 2**SBADDR_BITS;
localparam PLANES = 2**PLADDR_BITS;
`ifdef functional
parameter S8FMLT_32K_TAA = 48; //AC 3.1
`endif
localparam DOH = 1; //Data out hold time AC 3.7
localparam S8FMLT_32K_TPWR = 1000; //AC 3.24
localparam S8FMLT_32K_TRST = 0;
localparam S8FMLT_32K_TAW = 6; //AC 3.5 width of clk pulse. Used to delay clk for all notifiers to settle
localparam ACLK_DELAY = S8FMLT_32K_TAW + 0.1;
localparam S8FMLT_32K_TCY = 51; //AC 3.2
localparam S8FMLT_32K_TS1 = 1000; // AC 3.9
localparam S8FMLT_32K_TS3 = 1000; // AC 3.16
//pump frequency parameter
localparam TPCLK_MIN = 19; //min cycle time for pclk OP.6
localparam TPCLK_MAX = 23; //max cycle time for pclk OP.6
`ifdef S8FMLT_32K_SYS_DISABLE_IREF_STARTUP_DELAY
parameter PWRISA = 0;
parameter PWRITIM= 0;
parameter TTURBO = 100; // turbo be should always be used,even when the start up delay is disabled
`else
parameter PWRISA = 5000; // 5us from power good or sleep to isao good
parameter PWRITIM= 5000; // 5us from power good or sleep to itim good
parameter TTURBO = 5000; // AC 1.25 5us required time for turbo_b to be 0 after iref trim settings
`endif
`ifdef S8FMLT_32K_SYS_DISABLE_MDAC_STARTUP_DELAY
parameter TTMD = 0; // power and active to output valid
parameter TTMD1= 0; // settle time for mdac change
parameter TTMD2= 0; // vdac off (inactive)
`else
parameter TTMD = 50000; // AC 3.17 power and active to output valid
parameter TTMD1= 25000; // AC 3.18 settle time for mdac change
parameter TTMD2= 15000; // AC 3.19 vdac off (inactive)
`endif
`ifdef USE_PG_PIN
`else
supply1 vpb_sw;
supply1 vpb;
supply1 vccd;
supply0 vnb;
supply0 vgnd;
`endif
input sleep;
input [3:0] bdac;
`ifdef USE_PG_PIN
input vpb_sw;
input vpb;
`endif
input scan_in1;
`ifdef USE_PG_PIN
input vccd;
`endif
input [3:0] mode;
output [63:0] dout;
input pe;
input [7:0] di;
input iso;
input reset;
`ifdef USE_PG_PIN
input vnb;
`endif
input [1:0] seq;
input scan_en;
input iref;
input pw;
input turbo_b;
inout amuxbusb;
input axa;
`ifdef USE_PG_PIN
input vgnd;
`endif
inout amuxbusa;
output scan_out1;
input [2:0] sdac;
input scan_in2;
input pnb;
input clk;
input pd1;
input pd2;
input vref;
output scan_out2;
input pclk;
input [3:0] ca;
input [2:0] cdac;
input [3:0] pdac;
input scan_mode;
input [6:0] pa;
`ifdef USE_PG_PIN
output vpwri_fm;
`endif
output xy_out;
input [4:0] tm;
input [7:0] ra;
input [4:0] idac;
input [7:0] mdac;
input [3:0] ndac;
output VPOS, VNEG, VMARG_AUX;
output itimo_nvl;
reg [ADDR_BITS-1:0] address;
reg [MODE_SIZE-1:0] mode_l,prev_mode;
reg [SEQ_SIZE-1:0] seq_l,prev_seq;
reg [MEM_SIZE-1:0] status;
reg [MEM_SIZE-1:0] re_program;
reg [DO_SIZE-1:0] memory [MEM_SIZE-1:0];
reg [DI_SIZE-1:0] page_latch [PAGE_SIZE-1:0];
// reg prg,ers;
reg busy; // flag that keeps trak of on going HV operations
// wire [DO_SIZE-1:0] dout;
reg [DO_SIZE-1:0] douti;
reg preprg_flag;
reg pwrall_flag;
reg page_clr_flag;
reg page_corrupt_flag;
reg reset_hv;
reg sequence_good; // flag that tracks propper sequencing in the HV modes
reg mode_good;
reg [DO_SIZE-1:0] fm_do_reg;
reg [PADDR_BITS-1:0] pa_l;
reg [DI_SIZE-1:0] di_l;
reg pw_l;
reg pnb_l;
reg [TADDR_BITS-1:0] tm_l;
reg reset_x;
// --- NOTIFIERS ---
reg notifier_iso,notifier_rst,notifier_rstw, notifier_tbb, notifier_pd2, notifier_clk, notifier_pe, notifier_scan1, notifier_scan2, notifier_pa, notifier_pw, notifier_di,
notifier_addr, notifier_mode, notifier_tm, notifier_seq, notifier_pump,notifier_pnb;
reg addr_timing_error,iso_timing_error,tbb_timing_error,pd2_timing_error,rst_timing_error,clk_timing_error,di_timing_error,pw_timing_error,pa_timing_error,
pe_timing_error,mode_timing_error,seq_timing_error, pump_timing_error,tm_timing_error,pnb_timing_error;
reg reset_notifier_errors;
reg reset_pump_timing_error;
reg ax_d ; //used to delay the inputs to solve any issues with 0 hold time
//reg [BADDR_BITS-1:0] ba_d ;
reg [RADDR_BITS-1:0] ra_d ;
reg [CADDR_BITS-1:0] ca_d ;
reg [MODE_SIZE-1:0] mode_d;
reg [SEQ_SIZE-1:0] seq_d;
reg [DI_SIZE-1:0] di_d;
reg [PADDR_BITS-1:0] pa_d;
reg pw_d;
reg [TADDR_BITS-1:0] tm_d;
reg pnb_d;
reg [ADDR_BITS-1:0] read_address;
reg tm_enpos,tm_enneg; //driven in tm logic
wire dclk ;
wire dpe ;
wire dscan_in1, dscan_in2 ;
wire [6:0] dpa ;
wire dpw ;
wire [7:0] ddi ;
wire [RADDR_BITS-1:0] dra ;
wire [1:0] dseq ;
wire [3:0] dca ;
wire [3:0] dmode ;
wire [3:0] dpdac ;
wire [3:0] dndac ;
wire daxa ;
wire [4:0] dtm;
wire dpnb;
wire dsleep;
wire pd2orsleep;
wire dreset;
wire dturbo_b;
//reg VMARG_AUX_ref;
// comment out; using virtual single plane architecture
//reg [ADDR_BITS-1:0] north_address;
//reg [ADDR_BITS-1:0] south_address;
reg dis_err_msgs;
wire print_enable;
//wire [DO_SIZE-1:0] pa_128bit;
wire gnd_good;
wire power_lv;
wire p_up;
`ifdef ATPG_SIM
wire scan_out1;
wire scan_out2;
wire xy_out = 1'b0;
`else
wire scan_out1 = 1'b0;
wire scan_out2 = 1'b0;
`endif
wire hv_good;
reg pclk_toggle,pclk_pulse;
reg pclk_period_good;
realtime tpclk00,tpclk11,tpclk10;
realtime prev_seq_sample,seq_sample;
wire vref_internal;
wire vlim;
wire iref_isa;
wire iref_itim;
wire read_isa;
wire read_itim;
wire vmargi;
wire vbl;
wire sleep_isa_del;
wire sleep_isa_x;
wire power_isa_del;
wire power_isa_x;
wire sleep_itim_del;
wire sleep_itim_x;
wire power_itim_del;
wire power_itim_x;
wire mdac_on_del;
wire mdac_on_x;
wire mdac_off_del;
wire mdac_off_x;
wire power_good;
wire inhibit_pe;
wire tm_en;
wire VMARG_AUX_int;
reg tm_vmarg, tm_en_nvl;
reg tm_isa,tm_itim;
reg tm_en_vctat;
reg tm_rdhvpl;
reg amuxbusa_int;
reg amuxbusb_int;
reg tm_xydec;
reg tm_disrow;
reg tm_encol;
reg clk_int;
reg clk_delayed;
reg [1:0] power_state;
reg flag_pd2topd1_error; // flag to display error message only once after pd2 or pd1 are sampled
reg flag_pd2topwr_error; // flag to display error message only once after pd2 or pd1 are sampled
reg mdac_x;
reg pnb_mdac_x;
reg tm_en_ttmd2_flag; // keeps track of margin mode return to be after ttmd2 time
reg margin_exit_error;
reg enter_margin_mode;
reg ers_pe_in_seq2;
reg prg_pe_in_seq2;
reg ers_prg_hv_error;
reg sdac_or_idac_x;
realtime pwr_up_time;
realtime pd1_down_time;
realtime pd2_down_time;
realtime reset_down_time;
event read,run_mode;
event pwr_up_trigger;
event pd1_trigger;
event pd2_trigger;
event reset_trigger;
event mdac_trigger;
event pclk_event;
event sdac_or_idac_event;
integer j;
integer pwrisa,pwritim,tturbo; // used for current referecve powerup delay timing
integer ttmd, ttmd1, ttmd2;
//dummy read in marginmode variables
reg [RADDR_BITS+AADDR_BITS-1:0] ra_l;
reg ra_ttmd1;
reg dummy_read_flag;
reg reset_dummy_read_flag;
event trigger_ra_monitor;
event reset_dummy_read_event;
assign pd1_int = 1'b0;
assign pd2_int = 1'b0;
assign pd2orsleep = pd2 || dsleep;
assign vpwri_fm = (vpb_sw!==1'b1)?1'bx:
((pd1_int===1'b0)||(pd2_int===1'b0))?vccd:
((pd1_int===1'b1)&&(pd2_int===1'b1))?1'bz:1'bx;
`ifdef ATPG_SIM
wire scanb_tm_dpg, scanb_mp_tm;
s8fmlt_32k_top_atpg fm32k_top (.vpwr(vpwri_fm), .vpb(vpb), .vnb(vnb), .vgnd(vgnd),
.iso(iso),.reset(reset),.clk(clk),
.scan_en(scan_en),.scan_mode(scan_mode),.scanb_mp_tm(scanb_mp_tm),.scanb_tm_dpg(scanb_tm_dpg),
.scan_in1(dscan_in1),.scan_out1(scan_out1),.scan_in2(dscan_in2),.scan_out2(scan_out2),
.mode(mode),.seq(seq),.ca(ca),.ra({1'b0,ra}),.axa(axa),.di(di),.pa(pa),.pw(pw),
.dout(dout)
);
s8fmlt_analog_top_atpg analog_top(.vpwr(vpwri_fm), .vpb(vpb), .vnb(vnb), .vgnd(vgnd),
.reset(reset),.clk(clk),.scan_mode(scan_mode),
.scan_en(scan_en),.scanb_tm_dpg(scanb_tm_dpg),.scanb_mp_tm(scanb_mp_tm),
.tm(tm),.pnb(pnb)
);
`else // ATPG_SIM
//----------------------------------------------------------------------------------------------------
//power good signals for simple logic
assign p_up = (vccd === 1'b1)&&(vpb===1'b1)&&(vpb_sw===1'b1)&&(vnb===1'b0)&&(vgnd===1'b0)&&(pd1_int===1'b0)&&(pd2_int===1'b0);
assign p_up_analog = (vccd === 1'b1)&&(vpb===1'b1)&&(vpb_sw===1'b1)&&(vnb===1'b0)&&(vgnd===1'b0)&&(pd1_int===1'b0);
assign power_down_analog = (vccd === 1'b1)&&(vpb_sw===1'b1)&&(vgnd===1'b0)&&(pd1_int===1'b1); //used as iso function for VPOS
assign power_down_amux = (vccd === 1'b1)&&(vpb_sw===1'b1)&&(vgnd===1'b0); //used in iso function
assign gnd_good = (vgnd === 1'b0)&&(vnb===1'b0);
//----------------------------------------------------------------------------------------------------
// vref internal logic to check on refsel
assign vref_internal = vref ;
//----------------------------------------------------------------------------------------------------
// vlim logic
assign vlim = (p_up_analog !== 1'b1) ? 1'bx : // if no power drivex
(pd2orsleep === 1'b1) ? 1'b0 : // if sleep and power drive 0
(pd2orsleep !== 1'b0) ? 1'bx : // if sleep is not valid drive x
vref_internal; // will propagate x from vref_internal
//--------------------------------------------------------------------------------------
// isa itim irefm logic
assign iref_isa = (pd2orsleep === 1'b1) ? 1'bz : // needs review after final schematic
(^pd2orsleep === 1'bx) ? 1'bx :
(iref !== 1'b1) ? 1'bx :
(vlim !== 1'b1 ) ? 1'bx :
(sleep_isa_x !== 1'b0) ? 1'bx: // includes sleep recover timing
(power_isa_x !== 1'b0) ? 1'bx: // includes power recover timing
(sdac_or_idac_x !== 1'b0) ? 1'bx: // includes transition time at trim buss change
(^{sdac,idac} === 1'bx) ? 1'bx : 1'b1 ;
always @(sdac or idac)
begin
disable sdac_or_idac_trigger;
#0;
-> sdac_or_idac_event;
end
always @(sdac_or_idac_event)
begin: sdac_or_idac_trigger
sdac_or_idac_x = 1'b1;
#(pwrisa);
sdac_or_idac_x = 1'b0;
end
assign read_isa = tm_isa?amuxbusa:iref_isa; // isa used for read operations will be either iref or external supplied
assign iref_itim = (pd2orsleep === 1'b1) ? 1'bz : // itim z when in sleep (per old s8tesd block)
(^pd2orsleep === 1'bx) ? 1'bx : // sleep needs to be valid
(iref !== 1'b1) ? 1'bx : // iref need to be 1
(sleep_itim_x !== 1'b0) ? 1'bx: // includes sleep recover timing
(power_itim_x !== 1'b0) ? 1'bx: // includes power recover timing
(sdac_or_idac_x !== 1'b0) ? 1'bx: // includes transition time at trim buss change
(^{sdac,idac} === 1'bx) ? 1'bx : 1'b1 ; // trim bits need to be valid
assign read_itim = tm_itim?amuxbusb:iref_itim;// itim used for read operations will be either iref or external supplied
assign itimo_nvl = ((p_up_analog !== 1'b1)||(^tm_itim === 1'bx)) ? 1'bx : ~read_itim ; //tm_itim dirty points to dirty tm buss
//----------------------------------------------------------------------------------------------------
// vctat logic
assign vctat = (p_up_analog !== 1'b1) ? 1'bx :
(^cdac === 1'bx)?1'bx:
(^{dpe===1'b1,tm_en===1'b1,tm_en_vctat,tm_enpos,tm_enneg}===1'bx)?1'bx:
(dpe===1'b1||tm_en===1'b1||tm_en_vctat||tm_enpos||tm_enneg)?vref_internal:1'b0;
//----------------------------------------------------------------------------------------------------
// hv_good logic pumps; pe is not part of the logic being treated separatelly
assign hv_common = ((pclk_toggle === 1'b1) && // checks pclk frequency
(pclk_pulse === 1'b1) && // checks pclk pulse width
(vref_internal === 1'b1) && // vref used for the neg pump
(pump_timing_error === 1'b0) && // ndac/pdac to pe timing error
(vctat === 1'b1) && // vctat used for the pos pump
(^{cdac}!== 1'bx)); // trim bits for the pumps need to be valid
assign hv_neg_good = (hv_common===1'b1) && (^dndac !== 1'bx); // separate check for VNEG
assign hv_pos_good = (hv_common===1'b1) && (^dpdac !== 1'bx); // separate check for VPOS
assign hv_good = hv_neg_good && hv_pos_good; //hv_good is good when both pumps are good
task hv_good_report ();
begin
$display("\t pclk frequency (must be 1) - %b",pclk_toggle);
$display("\t pclk pulse width (must be 1) - %b",pclk_pulse);
$display("\t vref must be 1 - %b",vref);
$display("\t cdac must be valid - %b",cdac );
$display("\t pdac must be valid - %b",dpdac);
$display("\t ndac must be valid - %b",dndac);
$display("\t ndac/pdac timing to pe (must be 1) - %b",pump_timing_error);
end
endtask
//----------------------------------------------------------------------------------------------------
// VPOS / VNEG drive
// Iso only isolates the negative pump; iso pin floating in VPOS
assign (supply1, supply0) VPOS = (power_down_analog===1'b1)?1'b1: // when power_down VPOS is 1
(p_up_analog !== 1'b1) ? 1'bx : //power for the analog block check
(^{pe,tm_enpos} === 1'bx) ? 1'bx : //pump enable check
(pe === 1'b1 || tm_enpos === 1'b1) ? (hv_pos_good?1'b1:1'bx):1'b1; // if the pump is enabled drive 1 if hv good else drive 1(noHV)
assign (supply1, supply0) VNEG = (iso===1'b1)?(gnd_good?1'b0:1'bx): //if iso is 1 check check grounds to be good
(^iso===1'bx)?1'bx: // is iso is bad drive x
(p_up_analog !== 1'b1) ? 1'bx : //power for the analog block check
(^{pe,tm_enneg} === 1'bx) ? 1'bx : //pump enable check
(pe === 1'b1 || tm_enneg === 1'b1) ? (hv_neg_good?1'b0:1'bx):1'b0; // if the pump is enabled drive 0 if hv good else drive 0(noHV)
//----------------------------------------------------------------------------------------------------
// vmargi logic; used in margin reads
assign tm_en = tm_vmarg || tm_en_nvl; //tm_en is now activation the mdac block for margin reads or nvl margin mode
assign vmargi = (p_up_analog !== 1'b1) ? 1'bx: // depends on pd1 only
(^tm_en === 1'bx) ? 1'bx: // tm_en x happens when tm is not clean and will propagate on vmarg or vmarg_aux
(tm_en === 1'b0) ? 1'b0: // active in margin mode test mode
(hv_good !== 1'b1) ? 1'bx: // uses VPOS and VNEG to set the margin mode voltage
(^{mdac,pnb_l}=== 1'bx) ? 1'bx : // pnb and mdac need to be clean
(mdac_on_x === 1'b1) ? 1'bx : // mdac is charged after ttmd
(mdac_x === 1'b1) ? 1'bx : // mdac transition time - ttmd1
(pnb_mdac_x === 1'b1) ? 1'bx : // pnb has to be constant when in margin mode
(tm_en_ttmd2_flag === 1'b1) ? 1'bx : // tm_en needs to stay 0 while the mdac block is discharging
1'b1;
//tm_en_nvl will be x when tm is not clean
assign vmarg = (tm_en_nvl===1'b1) ? 1'bz :
(tm_en_nvl===1'b0) ? vmargi: 1'bx;
assign VMARG_AUX_int = (tm_en_nvl===1'b1) ? ~vmargi :
(tm_en_nvl===1'b0) ? 1'bz : 1'bx;
//monitor changes in ra for marginmode and dummy mode
always @ (ra_l) //sampled ra address
begin
disable ra_monitor;
#0;
-> trigger_ra_monitor;
end
always @(trigger_ra_monitor)
begin: ra_monitor
ra_ttmd1 = 1'b1; //used in dummy read logic and read corrupt during margin mode
#(ttmd1);
ra_ttmd1 = 1'b0;
end
assign ra_margin_mode_dummy = ra_ttmd1 & tm_vmarg;
always @(reset_dummy_read_event)
begin
reset_dummy_read_flag = 1'b1;
#0.1;
reset_dummy_read_flag = 1'b0;
end
always @(posedge reset or posedge ra_margin_mode_dummy or posedge mdac_on_x or posedge mdac_off_x or posedge reset_dummy_read_flag or posedge reset_hv)
begin
if (reset || reset_dummy_read_flag || reset_hv)
begin
dummy_read_flag = 1'b0;
end
else
begin
dummy_read_flag = 1'b1;
end
end
//----------------------------------------------------------------------------------------------------
// vbl logic
assign vbl = (p_up_analog !== 1'b1) ? 1'bx: //depends on pd1 only
(tm_rdhvpl === 1'b1) ? 1'bz: //disabled during read plage latch test mode
(^bdac === 1'bx) ? 1'bx:1'b1; // bdac sets the vbl voltage and it need to be valid
//----------------------------------------------------------------------------------------------------
// iref timing
//isa timing depending on sleep and power good
assign #(0,pwrisa) sleep_isa_del = pd2orsleep;
assign sleep_isa_x = (~pd2orsleep) && sleep_isa_del;
assign #(pwrisa,0) power_isa_del = p_up_analog;
assign power_isa_x = power_good && (!power_isa_del);
//itim timing idependig on sleep and power good
assign #(0,pwritim) sleep_itim_del = pd2orsleep;
assign sleep_itim_x = (!pd2orsleep) && sleep_itim_del;
assign #(pwritim,0) power_itim_del = p_up_analog;
assign power_itim_x = power_good && (!power_itim_del);
//----------------------------------------------------------------------------------------------------
// turbo_b timing check to resume read after current settup change
reg wait_for_turbo_b;
realtime turbo_required_detected_time;
realtime negedge_turbo_b_time;
// when trims change or getting out of sleep or getting out of power bad; record the time and set a flag to corrupt eventural read operations
always @(negedge sleep or sdac or idac or posedge p_up)
begin
turbo_required_detected_time = $realtime;
wait_for_turbo_b = 1'b1;
end
//record negedge turbo_b time
always @(negedge turbo_b)
begin
negedge_turbo_b_time = $realtime;
end
//check turbo_b timing to resume correct read opearations
always @(posedge turbo_b)
begin
if (($realtime - turbo_required_detected_time >= tturbo)&&
($realtime - negedge_turbo_b_time >= tturbo))
begin
wait_for_turbo_b = 1'b0;
end
end
//----------------------------------------------------------------------------------------------------
// vdac timing
// ttmd timing - mdac charge
assign #(ttmd,0) mdac_on_del = tm_en;
assign mdac_on_x = tm_en && (~mdac_on_del);
// ttmd1 timing - mdac change
always @(mdac)
begin
disable mdac_tr;
#0;
-> mdac_trigger;
end
always @(mdac_trigger)
begin: mdac_tr
mdac_x = 1'b1;
#(ttmd1);
mdac_x = 1'b0;
end
// ttmd2 timing - mdac discharge
assign #(0,ttmd2) mdac_off_del = tm_en;
assign mdac_off_x = (~tm_en) && mdac_off_del;
wire #0 tm_en_glitch_free = tm_en;
always @(pnb_l or negedge tm_en_glitch_free)
begin
if (tm_en === 1'b0)
begin
pnb_mdac_x = 1'b0;
end
else
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Pnb cannot change state in margin mode in %m @ %d",$time);
pnb_mdac_x = 1'b1;
end
end
always @ (tm_en)
begin
if (tm_en === 1'b0)
begin
tm_en_ttmd2_flag = 1'b0;
end
else
begin
if (mdac_off_x === 1'b1)
begin
tm_en_ttmd2_flag = 1'b1;
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: tm_en is not 0 while mdac is dischargin for ttmd2 time in %m @ %d",$time);
end
end
end
always @(tm_vmarg)
begin
if (tm_vmarg === 1'b1)
begin
enter_margin_mode = 1'b1;
end
else
begin
if ((enter_margin_mode === 1'b1)&&(tm_vmarg === 1'b0))
begin
enter_margin_mode = 1'b0;
margin_exit_error = 1'b1; // set the margin exit error flag when tm_vmarg is 0 after tm_vmarg was 1;
// this flag will reset when reset hv mode is cloked in or if the workarounf s130 is detected
end
end
end
//----------------------------------------------------------------------------------------------------
//
always @(hv_good or dpe or seq_l or dreset or reset_hv or posedge reset_x)
begin
#0; //eliminates race condition between setuphold delayed signals
if ((reset_x === 1'b1)&&(dpe === 1'b1))
begin
ers_prg_hv_error = 1'b1;
end
else if ((dreset === 1'b1)||(reset_hv === 1'b1))
begin
ers_prg_hv_error = 1'b0;
end
else if ((hv_good !== 1'b1)&&(dpe === 1'b1))
begin
ers_prg_hv_error = 1'b1;
end
else if (seq_l === 2'd3)
begin
#1; // wait one ns for the HV operation to finish then reset the error flag
ers_prg_hv_error = 1'b0;
end
end
//----------------------------------------------------------------------------------------------------
// initialize memory based on the CODEFILE
initial
begin
$readmemh(CODEFILE, memory);
for(j = 0;j < MEM_SIZE;j = j + 1)
begin
if (memory[j] === {DO_SIZE{1'b0}})
status[j] = 0;
else
status[j] = 1;
end
end
//----------------------------------------------------------------------------------------------------
//disable error messages option
initial
begin
pwrisa = PWRISA;
pwritim = PWRITIM;
tturbo = TTURBO;
ttmd = TTMD;
ttmd1 = TTMD1;
ttmd2 = TTMD2;
dis_err_msgs = 1'b1;
`ifdef S8FMLT_32K_SYS_DIS_ERR_MSGS
`else
#1;
dis_err_msgs = 1'b0;
`endif
end
//----------------------------------------------------------------------------------------------------
// print enable logic
assign print_enable = (dis_err_msgs === 1'b0) && (scan_mode !== 1'b1);
//----------------------------------------------------------------------------------------------------
// data out drive logic; depends on reset and the read operation (douti)
always @(read or posedge dreset or douti or negedge power_good or posedge reset_x)
begin
if ((power_good !==1)||(reset_x===1'b1))
begin
fm_do_reg <= {DO_SIZE{1'bx}};
end
else
begin
if (dreset === 1'b1)
begin
fm_do_reg <= {DO_SIZE{1'b0}};
end
else if (dreset === 1'b0)
begin
`ifdef functional
//add the delay when the functional macro is defind only
#(S8FMLT_32K_TAA-ACLK_DELAY);
`endif
fm_do_reg <= douti;
end
else
begin
fm_do_reg <= {DO_SIZE{1'bx}};
end
end
end
assign dout = (iso===1'b1)?(gnd_good?{DO_SIZE{1'b0}}:{DO_SIZE{1'bx}}):
(^iso===1'bx)?{DO_SIZE{1'bx}}:
(power_good===1'b0)?{DO_SIZE{1'bx}}:fm_do_reg;
//----------------------------------------------------------------------------------------------------
// power up sequence check for flash functionality
localparam PWR_OFF = 0;
localparam PWR_EN = 1;
localparam PWR_UP = 2;
localparam PWR_GOOD = 3;
wire power_up;
assign power_up = (vccd === 1'b1)&&(vpb_sw === 1'b1)&&(vpb === 1'b1)&&(vnb === 1'b0)&&(vgnd === 1'b0);
always @(power_up)
begin
if (power_up === 1'b1)
begin
pwr_up_time = $realtime;
flag_pd2topwr_error = 1'b1;
end
->pwr_up_trigger;
end
always @(pd1_int)
begin
if (pd1_int === 1'b0)
begin
pd1_down_time = $realtime;
flag_pd2topd1_error = 1'b0; // power-up sequence flag disabled due to pd1, pd2 repurpose
end
->pd1_trigger;
end
always @(pd2_int)
begin
if (pd2_int === 1'b0)
begin
pd2_down_time = $realtime;
flag_pd2topd1_error = 1'b0; // power-up sequence flag disabled due to pd1, pd2 repurpose
flag_pd2topwr_error = 1'b0; // power-up sequence flag disabled due to pd1, pd2 repurpose
end
->pd2_trigger;
end
always @(dreset)
begin
if (dreset === 1'b0)
begin
reset_down_time = $realtime;
end
->reset_trigger;
end
always @(pwr_up_trigger or pd1_trigger or pd2_trigger or reset_trigger) // always @(*) not used;make sure the always triggers after the time is sampled
begin
casex ({power_up,pd1_int,pd2_int,dreset})
4'b0xxx,4'b111x:
begin
power_state = PWR_OFF;
end
4'b101x,4'b110x:
begin
power_state = PWR_EN;
end
4'b1001:
begin
if (power_state != PWR_GOOD) // this could be a reset pulse during power good
begin
power_state = PWR_UP;
if ((pd2_down_time - pd1_down_time < S8FMLT_32K_TPWR))
begin
if ((print_enable)&&$time>0 &&(flag_pd2topd1_error===1'b1))
begin
$display ("===ERROR=== s8fmlt_32k_sys: Inrush current detected; pd2 to pd1 timing violated in %m @ %d",$time);
flag_pd2topd1_error = 1'b0; //disable the error message until the next pd2, pd1, or pwr_up smaple
end
end
if ((pd2_down_time - pwr_up_time< S8FMLT_32K_TPWR))
begin
if ((print_enable)&&$time>0 &&(flag_pd2topwr_error===1'b1))
begin
$display ("===ERROR=== s8fmlt_32k_sys: Inrush current detected; pd2 to vccd timing violated in %m @ %d",$time);
flag_pd2topwr_error = 1'b0; //disable the error message until the next pd2, pd1, or pwr_up smaple
end
end
end
end
4'b1000:
begin
power_state = PWR_UP;
if ((pd2_down_time - pd1_down_time < S8FMLT_32K_TPWR))
begin
if ((print_enable)&&$time>0 &&(flag_pd2topd1_error===1'b1))
begin
$display ("===ERROR=== s8fmlt_32k_sys: Inrush current detected; pd2 to pd1 timing violated in %m @ %d",$time);
flag_pd2topd1_error = 1'b0; //disable the error message until the next pd2, pd1, or pwr_up smaple
end
end
if ((pd2_down_time - pwr_up_time< S8FMLT_32K_TPWR))
begin
if ((print_enable)&&$time>0 &&(flag_pd2topwr_error===1'b1))
begin
$display ("===ERROR=== s8fmlt_32k_sys: Inrush current detected; pd2 to vccd timing violated in %m @ %d",$time);
flag_pd2topwr_error = 1'b0; //disable the error message until the next pd2, pd1, or pwr_up smaple
end
end
if (((reset_down_time - pd2_down_time)>=S8FMLT_32K_TRST)&&((reset_down_time - pd1_down_time)>=S8FMLT_32K_TRST))
begin
power_state = PWR_GOOD;
//r_clear_pages = 1; // create one page clear pulse.Does not affect external timing
//#1;
//r_clear_pages = 0;
end
end
default:
begin
power_state = PWR_EN;
end
endcase
end
assign power_good = (power_state === PWR_GOOD);
assign inhibit_pe = (power_state === PWR_OFF);
assign power_lv = (power_state === PWR_GOOD)||(power_state === PWR_UP);
//----------------------------------------------------------------------------------------------------
//sample sync inputs - wait for 0 hold time
always @(*) begin ax_d <= #ACLK_DELAY daxa; end
always @(*) begin ra_d <= #ACLK_DELAY dra; end
always @(*) begin ca_d <= #ACLK_DELAY dca; end
always @(*) begin mode_d <= #ACLK_DELAY dmode; end
always @(*) begin seq_d <= #ACLK_DELAY dseq; end
always @(*) begin di_d <= #ACLK_DELAY ddi; end
always @(*) begin pa_d <= #ACLK_DELAY dpa; end
always @(*) begin pw_d <= #ACLK_DELAY dpw; end
always @(*) begin tm_d <= #ACLK_DELAY dtm; end
always @(*) begin pnb_d <= #ACLK_DELAY dpnb; end
//----------------------------------------------------------------------------------------------------
// sample sync inputs with clk
always @(*) begin clk_delayed <= #S8FMLT_32K_TAW dclk;end // delay aclk by 4ns to account for the pulse with timing check notifier
always @(clk_delayed)
begin
if (clk_timing_error)
begin
clk_int = 1'b0;
if (print_enable)
begin
$display ("===ERROR=== s8fmlt_32k_sys: clk pulse width timing violation detected. This pulse will be ignored in %m @ %d",$time);
end
end
else
begin
clk_int = clk_delayed;
end
end
always @(posedge clk_int or posedge dreset or posedge reset_hv or posedge reset_x)
begin
if (dreset === 1'b1)
begin
address <= {ADDR_BITS{1'b0}};
read_address <= {ADDR_BITS{1'b0}};
mode_l <= {MODE_SIZE{1'b0}};
seq_l <= {SEQ_SIZE{1'b0}};
prev_mode <= {MODE_SIZE{1'b0}};
prev_seq <= {SEQ_SIZE{1'b0}};
pa_l <= {PADDR_BITS{1'b0}};
di_l <= {DI_SIZE{1'b0}};
pw_l <= 1'b0;
tm_l <= {TADDR_BITS{1'b0}};
ra_l <= {(RADDR_BITS+AADDR_BITS){1'b0}};
//reset flags and latches
preprg_flag <= 1'b0;
pwrall_flag <= 1'b0;
page_clr_flag <= 1'b0;
page_corrupt_flag <= 1'b0;
margin_exit_error <= 1'b0;
pnb_l <= 1'b0;
end
else if ((^dreset === 1'bx)||(reset_x===1'b1))
begin
address <= {ADDR_BITS{1'bx}};
read_address <= {ADDR_BITS{1'bx}};
mode_l <= {MODE_SIZE{1'bx}};
seq_l <= {SEQ_SIZE{1'bx}};
prev_mode <= {MODE_SIZE{1'bx}};
prev_seq <= {SEQ_SIZE{1'bx}};
pa_l <= {PADDR_BITS{1'bx}};
di_l <= {DI_SIZE{1'bx}};
pw_l <= 1'bx;
tm_l <= {TADDR_BITS{1'bx}};
ra_l <= {(RADDR_BITS+AADDR_BITS){1'bx}};
//reset flags and latches
preprg_flag <= 1'bx;
pwrall_flag <= 1'bx;
page_clr_flag <= 1'bx;
page_corrupt_flag <= 1'bx;
pnb_l <= 1'bx;
end
else if (reset_hv === 1'b1)
begin
prev_mode <= {MODE_SIZE{1'b0}};
prev_seq <= {SEQ_SIZE{1'b0}};
mode_l <= {MODE_SIZE{1'b0}};
seq_l <= {SEQ_SIZE{1'b0}};
end
else
begin
address <= {ax_d,ra_d,ca_d};
prev_mode <= mode_l;
prev_seq <= seq_l;
mode_l <= mode_d;
seq_l <= seq_d;
pa_l <= pa_d;
di_l <= di_d;
pw_l <= pw_d;
tm_l <= tm_d;
ra_l <= {ax_d,ra_d};
pnb_l <= pnb_d;
#0.1;
if (pd2orsleep === 1'b0)
begin
->run_mode; // start executin operations only when not in sleep
end
end
end
//----------------------------------------------------------------------------------------------------
// Reset based in seq 0
always @(*)
begin
if (seq_l === 2'b00)
begin
ers_pe_in_seq2 = 1'b0; // clear pe error at the end of erase
prg_pe_in_seq2 = 1'b0; // clear pe error at the end of program
reset_pump_timing_error = 1'b1; // create a reset pulse for the pump timing error
#1;
reset_pump_timing_error = 1'b0;
end
end
//----------------------------------------------------------------------------------------------------
// program mode detect
assign program_mode = (mode_l === PRG_WL)||(mode_l === PRG_SC)||(mode_l === PRG_BK)||(mode_l === PRG_BK_ALL);
//----------------------------------------------------------------------------------------------------
// Write data into page latches
always @(run_mode or
posedge dreset or
page_clr_flag or
page_corrupt_flag or
negedge power_lv or
posedge reset_x )
begin
//check for z in data in
for (j=0;j<DI_SIZE;j=j+1)
begin
if (di_l[j] === 1'bz)
begin
di_l[j] = 1'bx;
end
end
//Start page write
if ((power_lv !== 1'b1) || (page_corrupt_flag === 1'b1) || (reset_x === 1'b1))
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
else // power good
begin
if (dreset === 1'b1)
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'b0}};
end
end
else if (dreset === 1'b0)
begin
if (page_clr_flag === 1'b1)
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'b0}};
end
end
else if (page_clr_flag === 1'b0)
begin
if (pw_l === 1'b1)
begin
if (pwrall_flag === 1'b1)
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]=di_l;
end
end
else if (pwrall_flag === 1'b0)
begin
if (^pa_l !== 1'bx)
begin
page_latch[pa_l] = di_l;
end
else // page address is valid
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
end
else // pwrall_flag not valid
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
end
else if (^pw_l === 1'bx)
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
end
else // page_clr_flag latches not valid
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
//check pw timing error
if (pw_timing_error)
begin
if ((!pa_timing_error)&&(!pwrall_flag))
begin
page_latch[pa_l] = {DI_SIZE{1'bx}};
end
else
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
end
if (di_timing_error && pw_l)
begin
if (pwrall_flag)
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
else
begin
page_latch[pa_l] = {DI_SIZE{1'bx}};
end
end
if (pa_timing_error && pw_l)
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
end
else // reset not valid
begin
for(j=0;j<PAGE_SIZE;j=j+1)
begin
page_latch[j]={DI_SIZE{1'bx}};
end
end
end
end
//-------------------------------------------------------------------------------------------
// mode decoding
always @(run_mode or pe) //or mode_l or seq_l
begin
page_clr_flag = 1'b0;
page_corrupt_flag = 1'b0;
if (dreset === 1'b0 && pd2orsleep === 1'b0 && scan_mode === 1'b0)
begin
if (mode_timing_error)
begin
if (print_enable) begin $display("===ERROR=== s8fmlt_32k_sys: mode ignored due to mode timing error in %m @ %d",$time); end
page_corrupt_flag = 1'b1; // trigger the write always block
read_memory; // call the read task to signal with x whent the mode is corrupted
-> read; //start the read operation witn the corrupted memory output
end
else
begin
case (mode_l)
READ:
begin
read_address = address;
read_memory; //updates memory output (douti)
-> read; //start the read operation with the new memroy output
-> reset_dummy_read_event;
end
PREPRG:
begin
set_preprg_flag;
end
PWRALL:
begin
set_pwrall_flag;
end
PS_IDLE:
begin
// idle operation; No mode operation; Used for write only operations
end
RSTHV :
begin
gen_reset_hv;
end
CLR_PAGE:
begin
set_pageclr_flag;
end
ERS_WL:
begin
erase_wl(address);
end
ERS_BK:
begin
erase_bk(address);
end
PRG_WL:
begin
program_wl(address);
end
PRG_BK:
begin
program_bk(address);
end
PRG_BK_ALL:
begin
program_bk_all(address);
end
default: // there are valid unused modes when the macro should do "nothing"
begin
if (^mode_l === 1'bx)
begin
page_corrupt_flag = 1'b1; // trigger the write always block
read_memory; // call the read task to signal with x whent the mode is corrupted
-> read; //start the read operation witn the corrupted memory output
end
end
endcase
prev_seq_sample = seq_sample;
end
end
end
//---------------------------------------------------------------------------------------
// Test mode decoding for tm[4:0]
assign amuxbusa = (iso===1'b1)?((power_down_amux===1'b1)?1'bz:1'bx):
(^iso===1'bx)?1'bx:
(power_good===1'b0)?1'bx:amuxbusa_int;
assign amuxbusb = (iso===1'b1)?((power_down_amux===1'b1)?1'bz:1'bx):
(^iso===1'bx)?1'bx:
(power_good===1'b0)?1'bx:amuxbusb_int;
assign VMARG_AUX = (p_up_analog === 1'b1)? VMARG_AUX_int:1'bx;
always @(*)
begin
amuxbusa_int = 1'bz;
amuxbusb_int = 1'bz;
tm_en_nvl = 1'b0;
tm_vmarg = 1'b0;
tm_enpos = 1'b0;
tm_enneg = 1'b0;
tm_rdhvpl = 1'b0;
tm_xydec = 1'b0;
tm_disrow = 1'b0;
tm_encol = 1'b0;
tm_isa = 1'b0;
tm_itim = 1'b0;
tm_en_vctat = 1'b0;
if (^tm_l===1'bx || tm_timing_error === 1'b1 || ^scan_mode===1'bx)
begin
amuxbusa_int = 1'bx;
amuxbusb_int = 1'bx;
tm_en_nvl = 1'bx;
tm_vmarg = 1'bx;
tm_enpos = 1'bx;
tm_enneg = 1'bx;
tm_rdhvpl = 1'bx;
tm_xydec = 1'bx;
tm_disrow = 1'bx;
tm_encol = 1'bx;
tm_isa = 1'bx;
tm_itim = 1'bx;
tm_en_vctat = 1'bx;
end
else if (scan_mode === 1'b0)
begin
case (tm_l)
5'd1:
begin
//tm_enpos = 1'b1;
//tm_enneg = 1'b1;
amuxbusa_int = VPOS;
amuxbusb_int = ~VNEG;
end
5'd2:
begin
if (pnb_l === 1'b1)
begin
tm_enpos = 1'b1; // enable positive pump
tm_vmarg = 1'b1; // enable mdac
amuxbusa_int = vmarg;
end
else if (pnb_l === 1'b0)
begin
//do nothing let amuxbus pins floating
end
else //margin mode has been set correctly but pnb is not clean
begin
amuxbusa_int = 1'bx;
amuxbusb_int = 1'bx;
end
end
5'd4:
begin
tm_vmarg = 1'b1; //enable mdac
if (pnb_l === 1'b1)
begin
tm_enpos = 1'b1; // enable positive pump
end
else if (pnb_l === 1'b0)
begin
tm_enneg = 1'b1; // enable negative pump
end
else //pnb dirty
begin
tm_enpos = 1'bx;
tm_enneg = 1'bx;
end
end
5'd5:
begin
tm_vmarg = 1'b1;
tm_isa = 1'b1;
tm_itim = 1'b1;
if (pnb_l === 1'b1)
begin
tm_enpos = 1'b1; // enable positive pump
end
else if (pnb_l === 1'b0)
begin
tm_enpos = 1'b1; // enable positive pump
tm_enneg = 1'b1; // enable negative pump
end
else //pnb dirty
begin
tm_enpos = 1'bx;
tm_enneg = 1'bx;
end
end
5'd6:
begin
tm_vmarg = 1'b1; // enable mdac
if (pnb_l === 1'b1)
begin
tm_enpos = 1'b1; // enable positive pump
amuxbusa_int = VPOS;
end
else if (pnb_l === 1'b0)
begin
tm_enpos = 1'b1; // enable positive pump
tm_enneg = 1'b1; // enable negative pump
amuxbusb_int = ~VNEG;
end
else //pnb dirty
begin
tm_enpos = 1'bx;
tm_enneg = 1'bx;
amuxbusa_int = 1'bx;
amuxbusb_int = 1'bx;
end
end
5'd7:
begin
tm_en_nvl = 1'b1;
if (pnb_l === 1'b1)
begin
tm_enpos = 1'b1; // enable positive pump
end
else if (pnb_l === 1'b0)
begin
tm_enneg = 1'b1; // enable negative pump
end
else //pnb dirty
begin
tm_enpos = 1'bx;
tm_enneg = 1'bx;
end
end
5'd8:
begin
amuxbusa_int = 1'b1;//isamon
amuxbusb_int = 1'b1;//itimmon
end
5'd9:
begin
tm_isa = 1'b1;
amuxbusb_int = 1'b1;//itimmon
end
5'd10:
begin
amuxbusa_int = 1'b1;//isamon
tm_itim = 1'b1;
end
5'd11:
begin
tm_isa = 1'b1;
tm_itim = 1'b1;
end
5'd13:
begin
tm_enpos = 1'b1;
amuxbusa_int = 1'b1;//isamon
amuxbusb_int = 1'b1;//itimmon
end
5'd16:
begin
tm_en_vctat = 1'b1; // enable vctat
tm_enpos = 1'b0;
amuxbusa_int = vref;//vref is an input, just pass it out does not depend on refsel
amuxbusb_int = vctat;//vctat is an internal wire NOTE - need to implement logic for when valid
end
5'd17://regular reads
begin
tm_en_vctat = 1'b1; //enable vctat to generate v700 and v1400
tm_enpos = 1'b1;
amuxbusa_int = vctat;//v700 - same logic as vctat
amuxbusb_int = vctat;//v1400 - same logic as vctat
end
5'd18://extreme timing reads - NOTE maybe need to add etrm_tim
begin
//amuxbusa_int = vbl;
tm_enpos = 1'b1;
amuxbusa_int = vlim;//v2
amuxbusb_int = vlim;
end
5'd19:
begin
tm_enpos = 1'b1;
amuxbusa_int = vbl;
end
5'd20:
begin
amuxbusa_int = iref;// is an input, just pass it out
end
5'd21:
begin
tm_enpos = 1'b1;
amuxbusb_int = iref;// NOTE add logic from iref if needed
end
5'd22:
begin
amuxbusa_int = vbl;
end
5'd24:
begin
tm_rdhvpl = 1'b1;
tm_disrow = 1'b1;
end
5'd25:
begin
tm_xydec = 1'b1;
end
5'd26:
begin
tm_xydec = 1'b1;
tm_disrow = 1'b1;
end
5'd27:
begin
tm_xydec = 1'b1;
tm_encol = 1'b1;
end
default:
begin
end
endcase
end
end
//--------------------------------------------------------------------------------------
// Read task
task read_memory(); // implement display switch based on the error (e.g. if power is bad disable the rest of the error messages)
reg read_x;
begin
read_x = 1'b0;
if (!power_good)
begin
if (print_enable && (dummy_read_flag!==1'b1)) $display("===ERROR=== s8fmlt_32k_sys: Design not powered during read in %m @ %d",$time);
read_x=1'b1;
end
if (dummy_read_flag===1'b1)
begin
if (print_enable &&(power_good)) $display("===WARNING=== s8fmlt_32k_sys: Dummy Read in Margin Mode detected in %m @ %d",$time);
end
if (^mode_l === 1'bx)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Received corrupted mode data in %m @ %d",$time);
read_x=1'b1;
end
if (read_isa !== 1'b1)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: isa not active in %m @ %d",$time);
read_x=1'b1;
end
if (read_itim !== 1'b1)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: itim not active in %m @ %d",$time);
read_x=1'b1;
end
if (seq_l !== 2'b00)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Read mode with sequence %d in %m @ %d",seq_l,$time);
read_x=1'b1;
end
if (seq_timing_error === 1'b1)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence timing violation during read %d in %m @ %d",seq_l,$time);
read_x=1'b1;
end
if (tm_vmarg===1'b1&&(^pnb_l === 1'bx))
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Margin mode read with pnb - %b in %m @ %d",pnb_l,$time);
read_x=1'b1;
end
if (tm_vmarg===1'b1&&(pnb_timing_error === 1'bx))
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Pnb timing violation during margin mode - %b in %m @ %d",pnb_l,$time);
read_x=1'b1;
end
if (tm_vmarg===1'b1&&(vmarg !== 1'b1))
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Margin mode read with VMARG. Check mdac bus - %b in %m @ %d",vmarg,$time);
read_x=1'b1;
end
if (tm_vmarg===1'b1&&(ra_ttmd1 === 1'b1))
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: ttmd1 not expired after change in the row address in %m @ %d",vmarg,$time);
read_x=1'b1;
end
if (mdac_off_x === 1'b1)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Read violating ttmd2 delay time after margin mode in %m @ %d",$time);
read_x=1'b1;
end
if (^dturbo_b === 1'bx)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Invalid turbo_b during read in %m @ %d",$time);
read_x=1'b1;
end
// if (wait_for_turbo_b !== 1'b0)
// begin
// if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Turbo_b was not 0 for %d after idac/sdac trim change or return to active mode in %m @ %d", tturbo,$time);
// read_x=1'b1;
// end
if (busy)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Mode changed to read during HV operation in %m @ %d",$time);
read_x=1'b1;
end
if (tbb_timing_error)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: read error due to turbo_b timing violation in %m @ %d",$time);
read_x=1'b1;
end
if (addr_timing_error)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: read error due to address timing violation in %m @ %d",$time);
read_x=1'b1;
end
if (iso_timing_error)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: read error due to iso tactive2 timing violation in %m @ %d",$time);
read_x=1'b1;
end
if (rst_timing_error)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: read error due to rst to clk timing violation in %m @ %d",$time);
read_x=1'b1;
end
if (pd2_timing_error)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: read error due to pd2 tactive timing violation in %m @ %d",$time);
read_x=1'b1;
end
if (^address===1'bx)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: read error due to invalid address in %m @ %d",$time);
read_x=1'b1;
end
if ((^tm_l === 1'bx)||(tm_timing_error === 1'b1))
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: tm bus is not valid (%b) in %m @ %d",tm_l,$time);
read_x = 1'b1;
end
if (margin_exit_error === 1'b1)
begin
if ((print_enable && (dummy_read_flag!==1'b1))&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: read corrupt due to incorrect margin mode exit in %m @ %d",$time);
read_x = 1'b1;
end
if (pd2orsleep !== 1'b0)
begin
read_x = 1'b1;
end
// check for special row address
if(read_address[ADDR_BITS-1] === 1'b1)
begin
read_address[ADDR_BITS-2:CADDR_BITS+SRADDR_BITS] ={(ADDR_BITS-2-CADDR_BITS-SRADDR_BITS+1){1'b0}};
end
if(read_x)
begin
douti = {DO_SIZE{1'bx}};
end
else if (tm_rdhvpl)
begin
douti =~{page_latch[{address[CADDR_BITS-1:0],3'b111}],
page_latch[{address[CADDR_BITS-1:0],3'b110}],
page_latch[{address[CADDR_BITS-1:0],3'b101}],
page_latch[{address[CADDR_BITS-1:0],3'b100}],
page_latch[{address[CADDR_BITS-1:0],3'b011}],
page_latch[{address[CADDR_BITS-1:0],3'b010}],
page_latch[{address[CADDR_BITS-1:0],3'b001}],
page_latch[{address[CADDR_BITS-1:0],3'b000}]};
end //read hvpl is asynchronous and uses the page address.
else if (tm_disrow)
begin
douti = {DO_SIZE{1'b1}};
end
else
begin
// if (read_address [ADDR_BITS-3:ADDR_BITS-4] === 2'b11)
// begin
// douti = {DO_SIZE{1'b1}};
// end
// else
begin
douti = memory[read_address];
end
end
end
endtask
// preprogram set task
task set_preprg_flag();
reg preprg_x;
begin
preprg_x = 1'b0;
if (!power_good)
begin
if (print_enable) $display("===ERROR=== s8fmlt_32k_sys: Design not powered during preprogram in %m @ %d",$time);
preprg_x=1'b1;
end
if (busy)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Mode changed to preprogram during HV operation in %m @ %d",$time);
preprg_x=1'b1;
end
if (seq_l != 2'b00)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Preprogram mode with sequence %d in %m @ %d",seq_l, $time);
preprg_x=1'b1;
end
if (iso_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Preprogram error due to iso tactive2 timing violation in %m @ %d",$time);
preprg_x=1'b1;
end
if (rst_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Preprogram error due to rst to clk timing violation in %m @ %d",$time);
preprg_x=1'b1;
end
if (pd2_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Preprogram error due to pd2 tactive timing violation in %m @ %d",$time);
preprg_x=1'b1;
end
if (seq_timing_error === 1'b1)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence timing violation during preprogram %d in %m @ %d",seq_l,$time);
preprg_x=1'b1;
end
if (pd2orsleep)
begin
if ((print_enable)&&(power_good)) $display("===WARNING=== s8fmlt_32k_sys: Preprogram mode detected during sleep - ignored in %m @ %d",$time);
preprg_x = 1'b1;
end
// if (clk_timing_error)
// begin
// if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Pre-program error due to clk timing violation in %m @ %d",$time);
// preprg_x=1'b1;
// end
if (preprg_x === 1'b0)
begin
preprg_flag = 1'b1;
end
else
begin
preprg_flag = 1'bx;
end
end
endtask
//page write all mode set task
task set_pwrall_flag();
reg pwrall_x;
begin
pwrall_x = 1'b0;
if (!power_good)
begin
if (print_enable) $display("===ERROR=== s8fmlt_32k_sys: Design not powered during page write all in %m @ %d",$time);
pwrall_x=1'b1;
end
if (busy)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Mode changed to page write all during HV operation in %m @ %d",$time);
pwrall_x=1'b1;
end
if (seq_l != 2'b00)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: page write all mode without sequence 0 in %m @ %d",$time);
pwrall_x=1'b1;
end
if (iso_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: page write all error due to iso tactive2 timing violation in %m @ %d",$time);
pwrall_x=1'b1;
end
if (rst_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: page write all error due to rst to clk timing violation in %m @ %d",$time);
pwrall_x=1'b1;
end
if (pd2_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: page write all error due to pd2 tactive timing violation in %m @ %d",$time);
pwrall_x=1'b1;
end
if (seq_timing_error === 1'b1)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence timing violation during set page write all %d in %m @ %d",seq_l,$time);
pwrall_x=1'b1;
end
if (pd2orsleep)
begin
if ((print_enable)&&(power_good)) $display("===WARNING=== s8fmlt_32k_sys: Page write all mode detected during sleep - ignored in %m @ %d",$time);
pwrall_x = 1'b1;
end
// if (clk_timing_error)
// begin
// if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Page write all flag error due to clk timing violation in %m @ %d",$time);
// pwrall_x=1'b1;
// end
if (pwrall_x === 1'b0)
begin
pwrall_flag = 1'b1;
end
else
begin
pwrall_flag = 1'bx;
end
end
endtask
//page clear mode set task
task set_pageclr_flag();
reg pageclr_x;
begin
pageclr_x = 1'b0;
if (!power_good)
begin
if (print_enable) $display("===ERROR=== s8fmlt_32k_sys: Design not powered during clear page latches mode in %m @ %d",$time);
pageclr_x=1'b1;
end
if (busy)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Mode changed to clear page latches during HV operation in %m @ %d",$time);
pageclr_x=1'b1;
end
if (seq_l != 2'b00)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: clear page latches mode without sequence 0 in %m @ %d",$time);
pageclr_x=1'b1;
end
if (iso_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: clear page latches mode error due to iso tactive2 timing violation in %m @ %d",$time);
pageclr_x=1'b1;
end
if (rst_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: clear page latches mode error due to rst to clk timing violation in %m @ %d",$time);
pageclr_x=1'b1;
end
if (pd2_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: clear page latches mode error due to pd2 tactive timing violation in %m @ %d",$time);
pageclr_x=1'b1;
end
if (seq_timing_error === 1'b1)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence timing violation during page reset %d in %m @ %d",seq_l,$time);
pageclr_x=1'b1;
end
if (pd2orsleep)
begin
if ((print_enable)&&(power_good)) $display("===WARNING=== s8fmlt_32k_sys: clear page latches mode detected during sleep - ignored in %m @ %d",$time);
pageclr_x = 1'b1;
end
// if (clk_timing_error)
// begin
// if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: clear page latches flag error due to clk timing violation in %m @ %d",$time);
// pageclr_x=1'b1;
// end
if (pageclr_x === 1'b0)
begin
page_clr_flag = 1'b1;
end
else
begin
page_clr_flag = 1'bx;
end
end
endtask
//generate reset hv pulse
task gen_reset_hv();
reg reset_hv_x;
begin
reset_hv_x = 1'b0;
if (!power_good)
begin
if (print_enable) $display("===ERROR=== s8fmlt_32k_sys: Design not powered during clear page latches mode in %m @ %d",$time);
reset_hv_x=1'b1;
end
if (seq_l != 2'b00)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: reset hv mode without sequence 0 in %m @ %d",$time);
reset_hv_x=1'b1;
end
if (iso_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: reset hv mode error due to iso tactive2 timing violation in %m @ %d",$time);
reset_hv_x=1'b1;
end
if (rst_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: reset hv mode error due to rst to clk timing violation in %m @ %d",$time);
reset_hv_x=1'b1;
end
if (pd2_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: reset hv mode error due to pd2 tactive timing violation in %m @ %d",$time);
reset_hv_x=1'b1;
end
if (seq_timing_error === 1'b1)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence timing violation during page reset %d in %m @ %d",seq_l,$time);
reset_hv_x=1'b1;
end
if (pd2orsleep)
begin
if ((print_enable)&&(power_good)) $display("===WARNING=== s8fmlt_32k_sys: clear page latches mode detected during sleep - ignored in %m @ %d",$time);
reset_hv_x = 1'b1;
end
if (reset_hv_x === 1'b0)
begin
margin_exit_error = 1'b0;
reset_hv = 1'b1;
#1;
reset_hv = 1'b0;
end
else
begin
reset_hv = 1'bx;
end
end
endtask
// check sequence task; called duting hv operations
task check_sequence ();
begin
sequence_good = 1'b0;
case (seq_l)
2'd0:
begin
if ((prev_seq === 2'd0)||(prev_seq === 2'd3))
begin
sequence_good = 1'b1;
end
end
2'd1:
begin
busy = 1'b1;
if ((prev_seq === 2'd1)||(prev_seq === 2'd0))
begin
sequence_good = 1'b1;
end
end
2'd2:
begin
if ((prev_seq === 2'd2)||(prev_seq === 2'd1))
begin
sequence_good = 1'b1;
end
end
2'd3:
begin
busy = 1'b0;
if (program_mode === 1'b1)
begin
preprg_flag = 1'b0;
pwrall_flag = 1'b0;
end
if (margin_exit_error === 1'b1)
begin
if ((prev_seq === 2'd3)||(prev_seq === 2'd1))
begin
sequence_good = 1'b1;
end
margin_exit_error = 1'b0;
reset_hv = 1'b1;
#1;
reset_hv = 1'b0;
end
if ((prev_seq === 2'd3)||(prev_seq === 2'd2))
begin
sequence_good = 1'b1;
end
end
default:
begin
sequence_good = 1'b0;
end
endcase
if (prev_seq !== seq_l)
begin //different sequence clocked in
seq_sample = $realtime;
case (prev_seq)
2'd0:
begin
if ((seq_sample - prev_seq_sample) < S8FMLT_32K_TCY-0.1)
begin
sequence_good = 1'b0;
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence 0 lasted for %d; less than TCY (%d) in %m @ %d",$realtime - prev_seq_sample,S8FMLT_32K_TCY,$time);
end
end
2'd1:
begin
if ((seq_sample - prev_seq_sample) < S8FMLT_32K_TS1-0.1)
begin
sequence_good = 1'b0;
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence 1 lasted for %d; less than TS1 (%d) in %m @ %d",$realtime - prev_seq_sample,S8FMLT_32K_TS1,$time);
end
end
2'd2:
begin
//covered in specify block;includes timings to pe as well
end
2'd3:
begin
if ((seq_sample - prev_seq_sample) < S8FMLT_32K_TS3-0.15)
begin
sequence_good = 1'b0;
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence 3 lasted for %d; less than TS3 (%d) in %m @ %d",$realtime - prev_seq_sample,S8FMLT_32K_TS3,$time);
end
end
default:
begin
end
endcase
end
if (seq_l > 1)
begin
if (mode_l === prev_mode)
begin
mode_good = 1'b1;
end
else
begin
mode_good = 1'b0;
end
end
end
endtask
task erase_wl;
//parameter ADDR_BITS = 14;
input [ADDR_BITS-1:0] addr;
reg [ADDR_BITS-1:0] erase_addr;
//reg [ADDR_BITS-1:0] i;
integer i;
reg erase_wl_x;
reg erase_x_all;
//reg ers_pe_in_seq2;
begin
//verify the running conditions
check_sequence; // updates the sequence good flag
if(seq_l === 2'b01) //reset the error bit in seq1 - begining of the erase operation
begin
erase_wl_x = 1'b0;
pe_timing_error = 1'b0;
erase_x_all = 1'b0;
end
if(!power_good && !inhibit_pe)
begin
if (print_enable) $display("===ERROR=== s8fmlt_32k_sys: model not powered during erase in %m @ %d",$time);
erase_wl_x = 1'b1;
end
if (!sequence_good)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence %d after Sequence %d, in erase mode in %m @ %d",seq_l,prev_seq,$time);
erase_wl_x = 1'b1;
end
if (seq_timing_error === 1'b1)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence timing violation during erase %d in %m @ %d",seq_l,$time);
erase_wl_x=1'b1;
end
if (!mode_good)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Mode change during erase operation - %h -> %h in %m @ %d",prev_mode,mode_l,$time);
erase_wl_x = 1'b1;
end
if (preprg_flag)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase with preprogram flag set in %m @ %d",$time);
erase_wl_x = 1'b1;
end
if (pd2orsleep)
begin
if ((print_enable)&&(power_good)) $display("===WARNING=== s8fmlt_32k_sys: Erase mode during sleep in %m @ %d",$time);
end
// if (clk_timing_error)
// begin
// if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase error due to clk timing violation in %m @ %d",$time);
// erase_wl_x=1'b1;
// end
if (addr_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase error due to ADDRESS timing violation in %m @ %d",$time);
erase_x_all=1'b1;
end
if (iso_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase error due to iso tactive1 timing violation in %m @ %d",$time);
erase_x_all=1'b1;
end
if (rst_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase error due to rst to aclkt timing violation in %m @ %d",$time);
erase_x_all=1'b1;
end
if (pd2_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase error due to pd2 tactive timing violation in %m @ %d",$time);
erase_x_all=1'b1;
end
if (^addr === 1'bx)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase with invalid address in %m @ %d",$time);
erase_x_all=1'b1;
end
if (margin_exit_error === 1'b1 && seq_l === 2'b10)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase corrupt due to incorrect margin mode exit in %m @ %d",$time);
erase_wl_x = 1'b1;
end
if (ers_prg_hv_error)
begin
if ((print_enable)&&(power_good))
begin
$display("===ERROR=== s8fmlt_32k_sys: HV voltages are not clean during the entire erase operation in %m @ %d",$time);
hv_good_report;
end
erase_wl_x = 1'b1;
end
erase_addr = {ADDR_BITS{1'b0}};
erase_addr[ADDR_BITS-1:CADDR_BITS]=addr[ADDR_BITS-1:CADDR_BITS];//trim the input address to ignore CA address
if(erase_addr[ADDR_BITS-1] === 1'b1)
begin
erase_addr[ADDR_BITS-2:CADDR_BITS+SRADDR_BITS] ={(BADDR_BITS-PLADDR_BITS+RADDR_BITS-SRADDR_BITS){1'b0}};
end
if ((!pd2orsleep) && (!inhibit_pe) && (erase_x_all === 1'b0))
begin
case ({pe,seq_l})
3'b000://sequece 0 pe 0
begin
ers_pe_in_seq2 = 1'b0;
end
3'b001://sequence 1 pe 0
begin
end
3'b010://sequence 2 pe 0
begin
end
3'b110://sequence 2 pe 1
begin // erase cicle - set to x at the begining of erase
ers_pe_in_seq2 = 1'b1;
for(i=0;i<COLUMNS;i=i+1)
begin
memory[erase_addr+i]= {DO_SIZE{1'bx}};
status[erase_addr+i]= 1'b1;
end
end
3'b011://sequence 3 pe 0
begin
if (ers_pe_in_seq2 === 1'b1)
begin
if(pe_timing_error === 1'b0)
begin
for(i=0;i<COLUMNS;i=i+1)
begin
if(erase_wl_x === 1'b0)
begin
memory[erase_addr+i]= {DO_SIZE{1'b0}};
status[erase_addr+i]= 1'b0;
end
else
begin
memory[erase_addr+i]= {DO_SIZE{1'bx}};
status[erase_addr+i]= 1'b1; // memory location still requires a clean program
end
end
end
else
begin //timing error; corrupt hv operation
$display("===ERROR=== s8fmlt_32k_sys: Memory location corrupted due to pe timing violation in %m @ %d",pe,seq_l,$time);
for(i=0;i<COLUMNS;i=i+1)
begin
memory[erase_addr+i]= {DO_SIZE{1'bx}};
status[erase_addr+i]= 1'b1;
end
end
end
//ers_pe_in_seq2 = 1'b0;
end
default:
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Pe is %b in sequence %d in %m @ %d",pe,seq_l,$time);
end
endcase
end
if (erase_x_all === 1'b1)
begin
$display("===ERROR=== s8fmlt_32k_sys: Corrupting entire memory due to invalid address in %m @ %d",$time);
for(j = 0;j < MEM_SIZE;j = j + 1)
begin
memory[j] = {DO_SIZE{1'bx}};
status[j] = 1;
end
end
end
endtask
// program row task
task program_wl;
//parameter ADDR_BITS = 16;
input [ADDR_BITS-1:0] addr;
reg [ADDR_BITS-1:0] program_addr;
integer i;
reg program_wl_x;
reg [CADDR_BITS-1:0] page_addr;
reg [COLUMNS-1:0] status_error;
reg prg_x_all;
//reg prg_pe_in_seq2;
reg program_ones;
begin
//verify the running conditions
check_sequence; // updates the sequence good flag
if(seq_l === 2'b01) //reset the error bit in seq1 - begining of the program operation
begin
program_wl_x = 1'b0;
pe_timing_error = 1'b0;
prg_x_all=1'b0;
end
if(!power_good && !inhibit_pe)
begin
if (print_enable) $display("===ERROR=== s8fmlt_32k_sys: model not powered during program in %m @ %d",$time);
program_wl_x = 1'b1;
end
if (!sequence_good)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence %d after Sequence %d, in program mode @%d",seq_l,prev_seq,$time);
program_wl_x = 1'b1;
end
if (seq_timing_error === 1'b1)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Sequence timing violation during program %d in %m @ %d",seq_l,$time);
program_wl_x=1'b1;
end
if (!mode_good)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Mode change during program operation - %h -> %h in %m @ %d",prev_mode,mode_l, $time);
program_wl_x = 1'b1;
end
if (vbl !== 1'b1)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Vbl voltage not active during program operation. Check bdac in %m @ %d",$time,);
program_wl_x = 1'b1;
end
if (pd2orsleep)
begin
if ((print_enable)&&(power_good)) $display("===WARNING=== s8fmlt_32k_sys: Program mode during sleep in %m @ %d",$time);
end
// if (clk_timing_error)
// begin
// if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Program error due to clk timing violation in %m @ %d",$time);
// program_wl_x=1'b1;
// end
if (addr_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Program error due to address timing violation in %m @ %d",$time);
prg_x_all=1'b1;
end
if (iso_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Program error due to iso tactive1 timing violation in %m @ %d",$time);
prg_x_all=1'b1;
end
if (rst_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Program error due to rst to aclk timing violation in %m @ %d",$time);
prg_x_all=1'b1;
end
if (pd2_timing_error)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Program error due to pd2 tactive timing violation in %m @ %d",$time);
prg_x_all=1'b1;
end
if (^addr === 1'bx)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Erase with invalid address in %m @ %d",$time);
prg_x_all=1'b1;
end
if (margin_exit_error === 1'b1 && seq_l === 2'b10 )
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: Program corrupt due to incorrect margin mode exit in %m @ %d",$time);
program_wl_x = 1'b1;
end
if (ers_prg_hv_error)
begin
if ((print_enable)&&(power_good))
begin
$display("===ERROR=== s8fmlt_32k_sys: Incorrect VPOS/VNEG drive during program in %m @ %d",$time);
hv_good_report;
end
program_wl_x = 1'b1;
end
program_addr = {ADDR_BITS{1'b0}};
program_addr[ADDR_BITS-1:CADDR_BITS]=addr[ADDR_BITS-1:CADDR_BITS];//trim the input address to ignore CA address
if(program_addr[ADDR_BITS-1] === 1'b1)
begin
program_addr[ADDR_BITS-2:CADDR_BITS+SRADDR_BITS] = {(BADDR_BITS-PLADDR_BITS+RADDR_BITS-SRADDR_BITS){1'b0}};
end
if ((!pd2orsleep) && (!inhibit_pe)&&(prg_x_all===1'b0))
begin
case ({pe,seq_l})
3'b000://sequece 0 pe 0
begin
prg_pe_in_seq2 = 1'b0;
end
3'b001://sequence 1 pe 0
begin
end
3'b010://sequence 2 pe 0
begin
end
3'b110://sequence 2 pe 1
begin
program_ones = preprg_flag;
prg_pe_in_seq2 = 1'b1;
for(i=0;i<COLUMNS;i=i+1)
begin
if (status[program_addr+i] === 1'b1 && preprg_flag === 1'b0)
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: program on un-erased memory location %h in %m @ %d",program_addr+i,$time);
re_program[program_addr+i]= 1'b1;
end
memory[program_addr+i]= {DO_SIZE{1'bx}};
//#0.01;
status[program_addr+i]= 1'b1;
end
end
3'b011://sequence 3 pe 0
begin
if (prg_pe_in_seq2 === 1'b1)
begin
if(pe_timing_error === 1'b0)
begin
for(i=0;i<COLUMNS;i=i+1)
begin
if(program_wl_x === 1'b0)
begin
if (program_ones === 1'b1)
begin // do preprogram
memory[program_addr+i]= {DO_SIZE{1'b1}};
status[program_addr+i]= 1'b1;
end
else if (program_ones === 1'b0)
begin
if (re_program[program_addr+i]!== 1'b1)
begin
page_addr = i;
memory[program_addr+i]= {page_latch[{page_addr,3'b111}],
page_latch[{page_addr,3'b110}],
page_latch[{page_addr,3'b101}],
page_latch[{page_addr,3'b100}],
page_latch[{page_addr,3'b011}],
page_latch[{page_addr,3'b010}],
page_latch[{page_addr,3'b001}],
page_latch[{page_addr,3'b000}]};
end
end
else
begin
memory[program_addr+i]= {DO_SIZE{1'bx}};
status[program_addr+i]= 1'b1;
end
end
else
begin
memory[program_addr+i]= {DO_SIZE{1'bx}};
status[program_addr+i]= 1'b1; // memory location still requires a clean program
end
end
end
else
begin //timing error; corrupt hv operation
$display("===ERROR=== s8fmlt_32k_sys: Memory location corrupted due to pe timing violation in %m @ %d",pe,seq_l,$time);
for(i=0;i<COLUMNS;i=i+1)
begin
memory[program_addr+i]= {DO_SIZE{1'bx}};
status[program_addr+i]= 1'b1;
end
end
end
//prg_pe_in_seq2 = 1'b0;
end
default:
begin
if ((print_enable)&&(power_good)) $display("===ERROR=== s8fmlt_32k_sys: pe is %b in sequence %d in %m @ %d",pe,seq_l,$time);
end
endcase
end
if (prg_x_all === 1'b1)
begin
$display("===ERROR=== s8fmlt_32k_sys: Corrupting entire memory due to invalid address in %m @ %d",$time);
for(j = 0;j < MEM_SIZE;j = j + 1)
begin
memory[j] = {DO_SIZE{1'bx}};
status[j] = 1;
end
end
end
endtask
task erase_sc;
//parameter ADDR_BITS = 16;
input [ADDR_BITS-1:0] addr;
reg [ADDR_BITS-1:0] erase_sc_addr;
integer k;
begin
erase_sc_addr = {ADDR_BITS{1'b0}};
erase_sc_addr[ADDR_BITS-1:CADDR_BITS+RADDR_BITS]=addr[ADDR_BITS-1:CADDR_BITS+RADDR_BITS];
if (erase_sc_addr[ADDR_BITS-1] === 1'b0)
begin
for(k=0;k<SECTOR_ROWS;k=k+1)
begin
erase_wl(erase_sc_addr);
erase_sc_addr[RADDR_BITS+CADDR_BITS-1:CADDR_BITS]=erase_sc_addr[RADDR_BITS+CADDR_BITS-1:CADDR_BITS]+1;
end
end
else if (erase_sc_addr[ADDR_BITS-1] === 1'b1)
begin
if ((print_enable))
begin
$display("===WARNING=== s8fmlt_32k_sys: Erase Sector in special rows is not allowed. Executing Erase WL in %m @ %d",$time);
end
//call erase wl for the input address when ax = 1
erase_wl(addr);
end
end
endtask
task erase_bk;
//parameter ADDR_BITS = 16;
input [ADDR_BITS-1:0] addr;
reg [ADDR_BITS-1:0] erase_bk_addr;
integer k;
begin
erase_bk_addr = {ADDR_BITS{1'b0}};
erase_bk_addr[ADDR_BITS-1]=addr[ADDR_BITS-1];
if (erase_bk_addr[ADDR_BITS-1] === 1'b0)
begin
erase_sc(erase_bk_addr);
/*
for(k=0;k<SECTORS;k=k+1)
begin
erase_sc(erase_bk_addr);
erase_bk_addr[BADDR_BITS+RADDR_BITS+CADDR_BITS-1:RADDR_BITS+CADDR_BITS]=erase_bk_addr[BADDR_BITS+RADDR_BITS+CADDR_BITS-1:RADDR_BITS+CADDR_BITS]+1;
end
*/
end
else if (erase_bk_addr[ADDR_BITS-1] === 1'b1)
begin
if ((print_enable))
begin
$display("===WARNING=== s8fmlt_32k_sys: Erase Bulk in special rows is not allowed. Executing Erase WL in %m @ %d",$time);
end
//call erase wl for the input address when ax = 1
erase_wl(addr);
end
end
endtask
task program_sc;
//parameter ADDR_BITS = 16;
input [ADDR_BITS-1:0] addr;
reg [ADDR_BITS-1:0] program_sc_addr;
integer k;
begin
program_sc_addr = {ADDR_BITS{1'b0}};
program_sc_addr[ADDR_BITS-1:CADDR_BITS+RADDR_BITS]= addr[ADDR_BITS-1:CADDR_BITS+RADDR_BITS];
program_sc_addr[CADDR_BITS]=addr[CADDR_BITS]; //keep Ra0 for odd even selection
if (program_sc_addr[ADDR_BITS-1] === 1'b0)
begin
for(k=0;k<SECTOR_ROWS;k=k+2)
begin
program_wl(program_sc_addr);
program_sc_addr[RADDR_BITS+CADDR_BITS-1:CADDR_BITS]=program_sc_addr[RADDR_BITS+CADDR_BITS-1:CADDR_BITS]+2;
end
end
else if (program_sc_addr[ADDR_BITS-1] === 1'b1)
begin
if ((print_enable))
begin
$display("===WARNING=== s8fmlt_32k_sys: Program Sector in special rows is not allowed. Executing Program WL in %m @ %d",$time);
end
//call program wl when ax is i
program_wl(addr);
end
end
endtask
task program_sc_all;
//parameter ADDR_BITS = 16;
input [ADDR_BITS-1:0] addr;
reg [ADDR_BITS-1:0] program_sc_all_addr;
integer k;
begin
program_sc_all_addr = {ADDR_BITS{1'b0}};
program_sc_all_addr[ADDR_BITS-1:CADDR_BITS+RADDR_BITS]=addr[ADDR_BITS-1:CADDR_BITS+RADDR_BITS];
if (program_sc_all_addr[ADDR_BITS-1] === 1'b0)
begin
for(k=0;k<SECTOR_ROWS;k=k+1)
begin
program_wl(program_sc_all_addr);
program_sc_all_addr[RADDR_BITS+CADDR_BITS-1:CADDR_BITS]=program_sc_all_addr[RADDR_BITS+CADDR_BITS-1:CADDR_BITS]+1;
end
end
else if (program_sc_all_addr[ADDR_BITS-1] === 1'b1)
begin
if ((print_enable))
begin
$display("===WARNING=== s8fmlt_32k_sys: Program Sector All in special rows is not allowed. Executing Program WL in %m @ %d",$time);
end
//call program wl when ax is i
program_wl(addr);
end
end
endtask
task program_bk;
//parameter ADDR_BITS = 16;
input [ADDR_BITS-1:0] addr;
reg [ADDR_BITS-1:0] program_bk_addr;
integer k;
begin
program_bk_addr = {ADDR_BITS{1'b0}};
program_bk_addr[ADDR_BITS-1]=addr[ADDR_BITS-1];
program_bk_addr[CADDR_BITS]=addr[CADDR_BITS];//keep Ra0 for odd even program
if (program_bk_addr[ADDR_BITS-1] === 1'b0)
begin
program_sc(program_bk_addr); // one sector, just pass address
/*
for(k=0;k<SECTORS;k=k+1)
begin
// if ((k != 3) && (k != 7)) // skip the 4 sector in each plane (48k instead of 64k)
begin
program_bk_addr[BADDR_BITS+RADDR_BITS+CADDR_BITS-1:RADDR_BITS+CADDR_BITS] = k;
program_sc(program_bk_addr);
end
end
*/
end
else if (program_bk_addr[ADDR_BITS-1] === 1'b1)
begin
if ((print_enable))
begin
$display("===WARNING=== s8fmlt_32k_sys: Program Bulk in special rows is not allowed. Executing Program WL in %m @ %d",$time);
end
//call program word-line when ax is 1
program_wl(addr);
end
end
endtask
task program_bk_all;
//parameter ADDR_BITS = 16;
input [ADDR_BITS-1:0] addr;
reg [ADDR_BITS-1:0] program_bk_all_addr;
integer k;
begin
program_bk_all_addr = {ADDR_BITS{1'b0}};
program_bk_all_addr[ADDR_BITS-1]=addr[ADDR_BITS-1];
if (program_bk_all_addr[ADDR_BITS-1] === 1'b0)
begin
program_sc_all(program_bk_all_addr); // one sector; just pass the address
/*
for(k=0;k<SECTORS;k=k+1)
begin
// if ((k != 3) && (k != 7)) // skip the 4 sector in each plane (48k instead of 64k)
begin
program_bk_all_addr[BADDR_BITS+RADDR_BITS+CADDR_BITS-1:RADDR_BITS+CADDR_BITS] = k;
program_sc_all(program_bk_all_addr);
end
end
*/
end
else if (program_bk_all_addr[ADDR_BITS-1] === 1'b1)
begin
if ((print_enable))
begin
$display("===WARNING=== s8fmlt_32k_sys: Program Bulk All in special rows is not allowed. Executing Program WL in %m @ %d",$time);
end
//call program word-line when ax is 1
program_wl(addr);
end
end
endtask
// ----- corrupt memory engine----
event corrupt_mem;
reg [ADDR_BITS-1:0] corrupt_address;
always @(corrupt_mem)
begin
memory[corrupt_address] = ~memory[corrupt_address];
end
assign xy_out_iso= (p_up===1'b0)?1'bx:
(^tm_xydec===1'bx)?1'bx:
(tm_xydec===1'b0)?1'b0:
(iref!==1'b1)?1'bx:
((~tm_disrow)&&(~tm_encol));
assign xy_out =(iso===1'b1)?(gnd_good?1'b0:1'bx):
(iso===1'b0)?xy_out_iso:1'bx;
//---
initial
begin
tpclk00 = 0;
tpclk11 = 0;
tpclk10 = 0.0;
prev_seq_sample = 0.0;
pclk_toggle = 0;
pclk_period_good = 1'b0;
pump_timing_error = 1'b0;
end
/*
always @(posedge pclk or negedge p_up_analog)
begin
if (p_up_analog === 1'b1)
begin
tpclk00 = tpclk11;
tpclk11 = $realtime;
if(tpclk00 > 0) // tpclk 0 means firt ed
begin
if(((tpclk11 - tpclk00) <= TPCLK_MAX) &&
((tpclk11 - tpclk00) >= TPCLK_MIN))
begin
pclk_toggle = 1;
end
else
begin
pclk_toggle = 0;
end
end
end
else // power is bad - reset all the time variables and switch pclk_toggle off
begin
pclk_toggle = 0;
tpclk00 = 0;
tpclk11 = 0;
end
end
*/
always @(negedge pclk or negedge p_up_analog)
begin
if (p_up_analog === 1'b1)
begin
if (pclk === 1'b0)
begin
tpclk10 = $realtime;
if(((tpclk10 - tpclk11) >= 0.4*(tpclk11 - tpclk00))&&
((tpclk10 - tpclk11) <= 0.6*(tpclk11 - tpclk00)))
begin
pclk_pulse = 1;
end
else
begin
pclk_pulse = 0;
end
end
else
begin
pclk_pulse = 0;
tpclk10 = 0.0;
end
end
else
begin
pclk_pulse = 0;
tpclk10 = 0.0;
end
end
always @(posedge pclk or negedge p_up_analog)
begin
if (p_up_analog === 1'b1)
begin
if(pclk === 1'b1)
begin
tpclk00 = tpclk11;
tpclk11 = $realtime;
if ((tpclk00 > 0) && ((tpclk11 - tpclk00) < TPCLK_MIN))
begin
pclk_period_good = 1'b0;
end
else
begin
pclk_period_good = 1'b1;
end
end
else
begin
pclk_period_good = 1'b0;
end
end
else
begin
pclk_period_good = 1'b0;
tpclk00 = 0;
tpclk11 = 0;
end
disable pclk_toggle_gen;
#0;
-> pclk_event;
end
always @(pclk_event)
begin:pclk_toggle_gen
if (pclk_period_good === 1'b1)
begin
pclk_toggle = 1'b1;
#TPCLK_MAX;
end
pclk_toggle = 1'b0;
end
`endif //ATPG_SIM
//---
assign tchk_and_not_scan_mode = power_good && ~scan_mode;
assign not_scan_en = ~scan_en;
assign not_pe = !pe;
assign pe_and_not_scan_mode = pe && ~scan_mode;
assign not_scan_mode = ~scan_mode;
`ifdef functional
assign dclk = clk;
assign dpe = pe;
assign dscan_in1 = scan_in1;
assign dscan_in2 = scan_in2;
assign dpa = pa;
assign dpw = pw;
assign ddi = di;
assign dra = ra;
assign dseq = seq;
//assign dba = ba;
assign dca = ca;
assign dmode = mode;
assign daxa = axa;
assign dpdac = pdac;
assign dndac = ndac;
assign dpnb = pnb;
assign dtm = tm;
assign dreset = reset;
assign dturbo_b = turbo_b;
assign dsleep = sleep;
`else
specify
specparam S8FMLT_32K_SYS_TCY = 51; //AC 3.2
specparam S8FMLT_32K_SYS_TCY_S = 18; //AC 3.2
specparam S8FMLT_32K_SYS_TAWH = 6; //AC 3.5
specparam S8FMLT_32K_SYS_TAWL = 6; //AC 3.6
specparam S8FMLT_32K_SYS_TAS = 3.5;//AC 3.3
specparam S8FMLT_32K_SYS_TAH = 0; //AC 3.4
specparam S8FMLT_32K_SYS_TPE_PRG_MIN = 1000;
specparam S8FMLT_32K_SYS_TSW = 20; //AC 3.23
specparam S8FMLT_32K_SYS_TS2P = 10000; //AC 3.10
specparam S8FMLT_32K_SYS_TPS3 = 50000; //AC 3.15
specparam S8FMLT_32K_SYS_TRW1 = 20; //AC 3.21
specparam S8FMLT_32K_SYS_TRW2 = 7000; //AC 3.22
specparam S8FMLT_32K_SYS_CLK_REC_PE = S8FMLT_32K_SYS_TPE_PRG_MIN+S8FMLT_32K_SYS_TPS3;
specparam S8FMLT_32K_SYS_TAA = 48;// 50 ns data out access time AC 3.1
specparam S8FMLT_32K_SYS_PUMPS = 3.5;// setup time; ndac/pdac - posedge pe //AC 3.3
specparam S8FMLT_32K_SYS_PUMPH = 0;// hold time; ndac/pdac - posedge pe //AC 3.4
specparam S8FMLT_32K_SYS_TAA_S = 10;//AC 3.28
specparam S8FMLT_32K_SYS_TRCS = 20;//AC 3.20
specparam S8FMLT_32K_SYS_TIDS = 10;//AC 3.27
specparam S8FMLT_32K_SYS_TACTIVE = 5000;//AC3.26
specparam S8FMLT_32K_SYS_TACTIVE1 = 80;//AC3.TBD
specparam S8FMLT_32K_SYS_TTURBO = 5000; //AC3.25
specparam S8FMLT_32K_SYS_TISO = 200; //AC2.TBD
//------------------------------------------------------------
// The specify block is imported form the S8FMLT_32K_SYS_top
// All parameters are defined in the header file (s8fm_h_32.v)
//------------------------------------------------------------
$period(posedge clk &&& not_scan_mode,S8FMLT_32K_SYS_TCY,notifier_clk );
$period(posedge clk &&& scan_mode,S8FMLT_32K_SYS_TCY_S,notifier_clk );
$width (posedge clk &&& power_good,S8FMLT_32K_SYS_TAWH,,notifier_clk );
$width (negedge clk &&& power_good,S8FMLT_32K_SYS_TAWL,,notifier_clk );
//$recovery(negedge pe,posedge clk &&& tchk_and_not_scan_mode,S8FMLT_32K_SYS_TPS3) ;
$recrem(negedge pe,posedge clk ,S8FMLT_32K_SYS_TPS3,0,notifier_pe,tchk_and_not_scan_mode,power_good,dpe,dclk) ;
//$recovery(posedge pe,posedge clk &&& tchk_and_not_scan_mode,S8FMLT_32K_SYS_CLK_REC_PE) ;
//$recovery(negedge reset,posedge clk &&& tchk,0) ;
$recrem(negedge reset &&& power_good,posedge clk ,S8FMLT_32K_SYS_TRCS,0,notifier_rst,,,dreset,dclk) ;
$recrem(negedge iso &&& power_good,posedge clk ,S8FMLT_32K_SYS_TACTIVE1,0,notifier_iso,,,diso,dclk) ;
$recrem(negedge pd2 &&& power_good,posedge clk ,S8FMLT_32K_SYS_TACTIVE,0,notifier_pd2,,,dpd2,dclk) ;
//$recovery(posedge turbo_b,posedge clk &&& tchk,0);
$recrem(posedge turbo_b &&& power_good,posedge clk,S8FMLT_32K_SYS_TIDS,0,notifier_tbb,,,dturbo_b,dclk);
$setuphold (posedge clk ,posedge pe,0,S8FMLT_32K_SYS_TS2P ,notifier_pe,tchk_and_not_scan_mode,power_good, dclk, dpe);
$width( posedge pe &&& tchk_and_not_scan_mode,S8FMLT_32K_SYS_TPE_PRG_MIN,,notifier_pe );
$width( posedge sleep,S8FMLT_32K_SYS_TSW );
//$recovery(negedge sleep,posedge turbo_b,0);
$recrem(negedge sleep,posedge turbo_b,S8FMLT_32K_SYS_TTURBO,0,,,,dsleep,dturbo_b); // this is sleep to clk and it is already used in iref timing
$width(posedge reset &&& not_pe,S8FMLT_32K_SYS_TRW1,,notifier_rstw);
$width(posedge reset &&& pe_and_not_scan_mode ,S8FMLT_32K_SYS_TRW2,,notifier_rstw);
$width(posedge pclk,S8FMLT_32K_SYS_TAWH);
$width(negedge pclk,S8FMLT_32K_SYS_TAWL);
//$setup(posedge scan_in &&& tchk, posedge clk &&& scan_mode, S8FMLT_32K_SYS_TAS,notifier_scan);
//$setup(negedge scan_in &&& tchk, posedge clk &&& scan_mode, S8FMLT_32K_SYS_TAS,notifier_scan);
$setuphold(posedge clk, posedge scan_in1, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_scan1,scan_mode,power_good,dclk,dscan_in1);
$setuphold(posedge clk, negedge scan_in1, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_scan1,scan_mode,power_good,dclk,dscan_in1);
$setuphold(posedge clk, posedge scan_in2, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_scan2,scan_mode,power_good,dclk,dscan_in2);
$setuphold(posedge clk, negedge scan_in2, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_scan2,scan_mode,power_good,dclk,dscan_in2);
if (not_scan_mode)(posedge clk => (xy_out : clk ) ) = (0:0:0,0:0:0);
// Might require to go back to (0:0:0,0:0:0) format after sdf verification
if(not_scan_mode)(posedge clk => (dout[0] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[0] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[1] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[1] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[2] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[2] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[3] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[3] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[4] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[4] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[5] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[5] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[6] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[6] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[7] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[7] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[8] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[8] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[9] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[9] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[10] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[10] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[11] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[11] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[12] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[12] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[13] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[13] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[14] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[14] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[15] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[15] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[16] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[16] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[17] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[17] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[18] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[18] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[19] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[19] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[20] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[20] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[21] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[21] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[22] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[22] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[23] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[23] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[24] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[24] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[25] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[25] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[26] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[26] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[27] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[27] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[28] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[28] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[29] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[29] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[30] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[30] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[31] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[31] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[32] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[32] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[33] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[33] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[34] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[34] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[35] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[35] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[36] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[36] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[37] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[37] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[38] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[38] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[39] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[39] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[40] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[40] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[41] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[41] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[42] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[42] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[43] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[43] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[44] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[44] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[45] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[45] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[46] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[46] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[47] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[47] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[48] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[48] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[49] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[49] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[50] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[50] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[51] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[51] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[52] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[52] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[53] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[53] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[54] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[54] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[55] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[55] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[56] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[56] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[57] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[57] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[58] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[58] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[59] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[59] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[60] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[60] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[61] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[61] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[62] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[62] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
if(not_scan_mode)(posedge clk => (dout[63] : clk ) ) = S8FMLT_32K_SYS_TAA;
if(scan_mode)(posedge clk => (dout[63] : clk ) ) = S8FMLT_32K_SYS_TAA_S;
(posedge clk => (scan_out1 : clk ) ) = S8FMLT_32K_SYS_TAA_S;
(posedge clk => (scan_out2 : clk ) ) = S8FMLT_32K_SYS_TAA_S;
(iso => (dout[0] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[1] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[2] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[3] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[4] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[5] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[6] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[7] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[8] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[9] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[10] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[11] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[12] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[13] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[14] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[15] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[16] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[17] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[18] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[19] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[20] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[21] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[22] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[23] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[24] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[25] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[26] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[27] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[28] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[29] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[30] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[31] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[32] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[33] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[34] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[35] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[36] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[37] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[38] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[39] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[40] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[41] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[42] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[43] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[44] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[45] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[46] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[47] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[48] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[49] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[50] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[51] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[52] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[53] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[54] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[55] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[56] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[57] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[58] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[59] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[60] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[61] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[62] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (dout[63] : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (scan_out1 : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (scan_out2 : iso ) ) = S8FMLT_32K_SYS_TISO;
(iso => (xy_out : iso ) ) = S8FMLT_32K_SYS_TISO;
$setuphold(posedge clk, posedge pa[6], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[6]);
$setuphold(posedge clk, negedge pa[6], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[6]);
$setuphold(posedge clk, posedge pa[5], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[5]);
$setuphold(posedge clk, negedge pa[5], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[5]);
$setuphold(posedge clk, posedge pa[4], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[4]);
$setuphold(posedge clk, negedge pa[4], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[4]);
$setuphold(posedge clk, posedge pa[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[3]);
$setuphold(posedge clk, negedge pa[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[3]);
$setuphold(posedge clk, posedge pa[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[2]);
$setuphold(posedge clk, negedge pa[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[2]);
$setuphold(posedge clk, posedge pa[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[1]);
$setuphold(posedge clk, negedge pa[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[1]);
$setuphold(posedge clk, posedge pa[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[0]);
$setuphold(posedge clk, negedge pa[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pa ,not_scan_en,power_good, dclk, dpa[0]);
$setuphold(posedge clk, posedge pw, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pw ,not_scan_en,power_good, dclk, dpw);
$setuphold(posedge clk, negedge pw, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pw ,not_scan_en,power_good, dclk, dpw);
$setuphold(posedge clk,posedge di[7], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[7] );
$setuphold(posedge clk,negedge di[7], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[7] );
$setuphold(posedge clk,posedge di[6], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[6] );
$setuphold(posedge clk,negedge di[6], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[6] );
$setuphold(posedge clk,posedge di[5], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[5] );
$setuphold(posedge clk,negedge di[5], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[5] );
$setuphold(posedge clk,posedge di[4], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[4] );
$setuphold(posedge clk,negedge di[4], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[4] );
$setuphold(posedge clk,posedge di[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[3] );
$setuphold(posedge clk,negedge di[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[3] );
$setuphold(posedge clk,posedge di[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[2] );
$setuphold(posedge clk,negedge di[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[2] );
$setuphold(posedge clk,posedge di[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[1] );
$setuphold(posedge clk,negedge di[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[1] );
$setuphold(posedge clk,posedge di[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[0] );
$setuphold(posedge clk,negedge di[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_di ,not_scan_en,power_good, dclk, ddi[0] );
$setuphold(posedge clk,posedge ra[7], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[7] );
$setuphold(posedge clk,negedge ra[7], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[7] );
$setuphold(posedge clk,posedge ra[6], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[6] );
$setuphold(posedge clk,negedge ra[6], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[6] );
$setuphold(posedge clk,posedge ra[5], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[5] );
$setuphold(posedge clk,negedge ra[5], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[5] );
$setuphold(posedge clk,posedge ra[4], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[4] );
$setuphold(posedge clk,negedge ra[4], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[4] );
$setuphold(posedge clk,posedge ra[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[3] );
$setuphold(posedge clk,negedge ra[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[3] );
$setuphold(posedge clk,posedge ra[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[2] );
$setuphold(posedge clk,negedge ra[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[2] );
$setuphold(posedge clk,posedge ra[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[1] );
$setuphold(posedge clk,negedge ra[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[1] );
$setuphold(posedge clk,posedge ra[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[0] );
$setuphold(posedge clk,negedge ra[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dra[0] );
$setuphold(posedge clk,posedge seq[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_seq ,not_scan_en,power_good, dclk, dseq[1] );
$setuphold(posedge clk,negedge seq[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_seq ,not_scan_en,power_good, dclk, dseq[1] );
$setuphold(posedge clk,posedge seq[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_seq ,not_scan_en,power_good, dclk, dseq[0] );
$setuphold(posedge clk,negedge seq[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_seq ,not_scan_en,power_good, dclk, dseq[0] );
$setuphold(posedge clk,posedge ca[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dca[3] );
$setuphold(posedge clk,negedge ca[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dca[3] );
$setuphold(posedge clk,posedge ca[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dca[2] );
$setuphold(posedge clk,negedge ca[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dca[2] );
$setuphold(posedge clk,posedge ca[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dca[1] );
$setuphold(posedge clk,negedge ca[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dca[1] );
$setuphold(posedge clk,posedge ca[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dca[0] );
$setuphold(posedge clk,negedge ca[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, dca[0] );
$setuphold(posedge clk,posedge mode[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_mode ,not_scan_en,power_good, dclk, dmode[3] );
$setuphold(posedge clk,negedge mode[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_mode ,not_scan_en,power_good, dclk, dmode[3] );
$setuphold(posedge clk,posedge mode[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_mode ,not_scan_en,power_good, dclk, dmode[2] );
$setuphold(posedge clk,negedge mode[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_mode ,not_scan_en,power_good, dclk, dmode[2] );
$setuphold(posedge clk,posedge mode[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_mode ,not_scan_en,power_good, dclk, dmode[1] );
$setuphold(posedge clk,negedge mode[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_mode ,not_scan_en,power_good, dclk, dmode[1] );
$setuphold(posedge clk,posedge mode[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_mode ,not_scan_en,power_good, dclk, dmode[0] );
$setuphold(posedge clk,negedge mode[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_mode ,not_scan_en,power_good, dclk, dmode[0] );
$setuphold(posedge clk,posedge axa, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, daxa );
$setuphold(posedge clk,negedge axa, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_addr ,not_scan_en,power_good, dclk, daxa );
$setuphold(posedge clk,posedge tm[4], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[4] );
$setuphold(posedge clk,negedge tm[4], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[4] );
$setuphold(posedge clk,posedge tm[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[3] );
$setuphold(posedge clk,negedge tm[3], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[3] );
$setuphold(posedge clk,posedge tm[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[2] );
$setuphold(posedge clk,negedge tm[2], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[2] );
$setuphold(posedge clk,posedge tm[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[1] );
$setuphold(posedge clk,negedge tm[1], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[1] );
$setuphold(posedge clk,posedge tm[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[0] );
$setuphold(posedge clk,negedge tm[0], S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_tm ,not_scan_en,power_good, dclk, dtm[0] );
$setuphold(posedge clk,posedge pnb, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pnb ,not_scan_en,power_good, dclk, dpnb );
$setuphold(posedge clk,negedge pnb, S8FMLT_32K_SYS_TAS, S8FMLT_32K_SYS_TAH, notifier_pnb ,not_scan_en,power_good, dclk, dpnb );
$setuphold(posedge pe,posedge ndac[3], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dndac[3] );
$setuphold(posedge pe,negedge ndac[3], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dndac[3] );
$setuphold(posedge pe,posedge ndac[2], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dndac[2] );
$setuphold(posedge pe,negedge ndac[2], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dndac[2] );
$setuphold(posedge pe,posedge ndac[1], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dndac[1] );
$setuphold(posedge pe,negedge ndac[1], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dndac[1] );
$setuphold(posedge pe,posedge ndac[0], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dndac[0] );
$setuphold(posedge pe,negedge ndac[0], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dndac[0] );
$setuphold(posedge pe,posedge pdac[3], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dpdac[3] );
$setuphold(posedge pe,negedge pdac[3], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dpdac[3] );
$setuphold(posedge pe,posedge pdac[2], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dpdac[2] );
$setuphold(posedge pe,negedge pdac[2], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dpdac[2] );
$setuphold(posedge pe,posedge pdac[1], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dpdac[1] );
$setuphold(posedge pe,negedge pdac[1], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dpdac[1] );
$setuphold(posedge pe,posedge pdac[0], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dpdac[0] );
$setuphold(posedge pe,negedge pdac[0], S8FMLT_32K_SYS_PUMPS, S8FMLT_32K_SYS_PUMPH, notifier_pump ,not_scan_mode,power_good, dpe, dpdac[0] );
endspecify
`endif
`ifdef ATPG_SIM
`else
always @(posedge dclk)
begin
#(S8FMLT_32K_TAW + 2);
reset_notifier_errors = 1'b1;
#1;
reset_notifier_errors = 1'b0;
end
always @(notifier_rstw)
begin //generate an internal reset pulse that will reset to x not 0
reset_x = 1'b1;
#1;
reset_x = 1'b0;
end
always @(notifier_rst or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
rst_timing_error = 1'b0;
end
else
begin
rst_timing_error = 1'b1;
end
end
always @(notifier_pd2 or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
pd2_timing_error = 1'b0;
end
else
begin
pd2_timing_error = 1'b1;
end
end
always @(notifier_tbb or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
tbb_timing_error = 1'b0;
end
else
begin
tbb_timing_error = 1'b1;
end
end
always @(notifier_iso or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
iso_timing_error = 1'b0;
end
else
begin
iso_timing_error = 1'b1;
end
end
always @(notifier_addr or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
addr_timing_error = 1'b0;
end
else
begin
addr_timing_error = 1'b1;
end
end
always @(notifier_seq or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
seq_timing_error = 1'b0;
end
else
begin
seq_timing_error = 1'b1;
end
end
always @(notifier_mode or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
mode_timing_error = 1'b0;
end
else
begin
mode_timing_error = 1'b1;
end
end
always @(notifier_clk or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
clk_timing_error = 1'b0;
end
else
begin
clk_timing_error = 1'b1;
end
end
always @(notifier_di or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
di_timing_error = 1'b0;
end
else
begin
di_timing_error = 1'b1;
end
end
always @(notifier_pw or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
pw_timing_error = 1'b0;
end
else
begin
pw_timing_error = 1'b1;
end
end
always @(notifier_pnb or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
pnb_timing_error = 1'b0;
end
else
begin
pnb_timing_error = 1'b1;
end
end
always @(notifier_pa or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
pa_timing_error = 1'b0;
end
else
begin
pa_timing_error = 1'b1;
end
end
always @(notifier_tm or posedge reset_notifier_errors or posedge dreset)
begin
if ((reset_notifier_errors===1'b1)||(dreset === 1'b1))
begin
tm_timing_error = 1'b0;
end
else
begin
tm_timing_error = 1'b1;
end
end
always @(notifier_pe or posedge dreset)
begin
if (dreset === 1'b1)
begin
pe_timing_error = 1'b0;
end
else
begin
pe_timing_error = 1'b1;
end
end
always @(notifier_pump or posedge reset_pump_timing_error or posedge dreset)
begin
if ((reset_pump_timing_error)||(dreset === 1'b1))
begin
pump_timing_error = 1'b0;
end
else
begin
pump_timing_error = 1'b1;
end
end
`endif // ATPG_SIM
`ifdef ATPG_SIM
always @(notifier_addr)
begin
fm32k_top.fm32k_nsw.predec.rpre.raddlat_10_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_9_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_8_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_7_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_6_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_5_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_4_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_3_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_2_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_1_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_0_.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.cpren.cadlat5.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.cpren.cadlat4.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.cpren.cadlat3.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.cpren.cadlat2.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.cpren.cadlat1.nfr <= notifier_addr;
fm32k_top.fm32k_nsw.predec.cpren.cadlat0.nfr <= notifier_addr;
end
always @(notifier_seq)
begin
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_seq_reg_1_.nfr <= notifier_seq;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_seq_reg_0_.nfr <= notifier_seq;
end
always @(notifier_mode)
begin
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_3_.nfr <= notifier_mode;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_2_.nfr <= notifier_mode;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_1_.nfr <= notifier_mode;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_0_.nfr <= notifier_mode;
end
always @(notifier_scan1)
begin
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_0_.nfr <= notifier_scan1;
end
always @(notifier_scan2)
begin
fm32k_top.fm32k_nsw.spine16x64.sa64.sa8_fm_0_.saout_fm_0_.dout_scan.scan_ff.nfr <= notifier_scan2;
end
always @(notifier_di)
begin
fm32k_top.fm32k_nsw.dinpg.dilat_7_.nfr <= notifier_di;
fm32k_top.fm32k_nsw.dinpg.dilat_6_.nfr <= notifier_di;
fm32k_top.fm32k_nsw.dinpg.dilat_5_.nfr <= notifier_di;
fm32k_top.fm32k_nsw.dinpg.dilat_4_.nfr <= notifier_di;
fm32k_top.fm32k_nsw.dinpg.dilat_3_.nfr <= notifier_di;
fm32k_top.fm32k_nsw.dinpg.dilat_2_.nfr <= notifier_di;
fm32k_top.fm32k_nsw.dinpg.dilat_1_.nfr <= notifier_di;
fm32k_top.fm32k_nsw.dinpg.dilat_0_.nfr <= notifier_di;
end
always @(notifier_pa)
begin
fm32k_top.fm32k_nsw.dinpg.palat_6_.nfr <= notifier_pa;
fm32k_top.fm32k_nsw.dinpg.palat_5_.nfr <= notifier_pa;
fm32k_top.fm32k_nsw.dinpg.palat_4_.nfr <= notifier_pa;
fm32k_top.fm32k_nsw.dinpg.palat_3_.nfr <= notifier_pa;
fm32k_top.fm32k_nsw.dinpg.palat_2_.nfr <= notifier_pa;
fm32k_top.fm32k_nsw.dinpg.palat_1_.nfr <= notifier_pa;
fm32k_top.fm32k_nsw.dinpg.palat_0_.nfr <= notifier_pa;
end
always @(notifier_pw)
begin
fm32k_top.fm32k_nsw.dinpg.pwlat.nfr <= notifier_pw;
end
always @(notifier_pnb)
begin
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.pnblat.nfr <= notifier_pnb;
end
always @(notifier_tm)
begin
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_4_.nfr <= notifier_tm;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_3_.nfr <= notifier_tm;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_2_.nfr <= notifier_tm;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_1_.nfr <= notifier_tm;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_0_.nfr <= notifier_tm;
end
//clk
always @(notifier_clk)
begin
fm32k_top.fm32k_nsw.predec.rpre.raddlat_10_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_9_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_8_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_7_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_6_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_5_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_4_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_3_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_2_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_1_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.rpre.raddlat_0_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.cpren.cadlat5.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.cpren.cadlat4.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.cpren.cadlat3.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.cpren.cadlat2.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.cpren.cadlat1.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.predec.cpren.cadlat0.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_seq_reg_1_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_seq_reg_0_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_3_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_2_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_1_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.mpcont.mpcon_top.mpcon.fi_mode_reg_0_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.dilat_7_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.dilat_6_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.dilat_5_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.dilat_4_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.dilat_3_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.dilat_2_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.dilat_1_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.dilat_0_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.palat_6_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.palat_5_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.palat_4_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.palat_3_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.palat_2_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.palat_1_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.palat_0_.nfr <= notifier_clk;
fm32k_top.fm32k_nsw.dinpg.pwlat.nfr <= notifier_clk;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.pnblat.nfr <= notifier_clk;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_4_.nfr <= notifier_clk;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_3_.nfr <= notifier_clk;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_2_.nfr <= notifier_clk;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_1_.nfr <= notifier_clk;
analog_top.tmcont.tmcont_nsw.tmcont_logic.tmcont_in.tmlat_0_.nfr <= notifier_clk;
end
`endif //ATPG_SIM notifier pass to scan chain
endmodule