// nv_ram_rwsthp_20x4: synthesizable model core
// Generated by /home/nvtools/branch/release/t194_rg/2017/06/01_10_25_11/nvtools/rams/scripts/ramgen - DO NOT EDIT
// Estimated area: 174.18 um^2 (nvstd_tsmc16fflr)
`ifdef _SIMULATE_X_VH_
`else
`ifndef SYNTHESIS
`define tick_x_or_0 1'bx
`define tick_x_or_1 1'bx
`else
`define tick_x_or_0 1'b0
`define tick_x_or_1 1'b1
`endif
`endif
// verilint 549 off - async flop inferred
// verilint 446 off - reading from output port
// verilint 389 off - multiple clocks in module
// verilint 287 off - unconnected ports
// verilint 401 off - Clock is not an input to the module (we use gated clk)
// verilint 257 off - delays ignored by synth tools
// verilint 240 off - Unused input
// verilint 542 off - enabled flop inferred
// verilint 210 off - too few module ports
// verilint 280 off - delay in non-blocking assignment
// verilint 332 off - not all possible cases covered, but default case exists
// verilint 390 off - multiple resets in this module
// verilint 396 off - flop w/o async reset
// verilint 69 off - case without default, all cases covered
// verilint 34 off - unused macro
// verilint 528 off - variable set but not used
// verilint 530 off - flop inferred
// verilint 550 off - mux inferred
// verilint 113 off - multiple drivers to flop
// leda ELB072 off
`timescale 1ns / 10ps
module nv_ram_rwsthp_20x4_logic (
               byp_sel,
               clk,
               dbyp,
               di,
               dout,
               ore,
               pwrbus_ram_pd,
               ra,
               re,
               scan_en,
               wa,
               we
        );
parameter FORCE_CONTENTION_ASSERTION_RESET_ACTIVE=1'b0;
// port list for submodule
input byp_sel;
input clk;
input [3:0] dbyp;
input [3:0] di;
output [3:0] dout;
input ore;
input [31:0] pwrbus_ram_pd;
input [4:0] ra;
input re;
input scan_en;
input [4:0] wa;
input we;
wire [7:0] sleep_en = pwrbus_ram_pd[7:0];
wire ret_en = pwrbus_ram_pd[8];
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_9 (.A(pwrbus_ram_pd[9]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_10 (.A(pwrbus_ram_pd[10]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_11 (.A(pwrbus_ram_pd[11]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_12 (.A(pwrbus_ram_pd[12]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_13 (.A(pwrbus_ram_pd[13]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_14 (.A(pwrbus_ram_pd[14]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_15 (.A(pwrbus_ram_pd[15]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_16 (.A(pwrbus_ram_pd[16]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_17 (.A(pwrbus_ram_pd[17]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_18 (.A(pwrbus_ram_pd[18]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_19 (.A(pwrbus_ram_pd[19]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_20 (.A(pwrbus_ram_pd[20]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_21 (.A(pwrbus_ram_pd[21]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_22 (.A(pwrbus_ram_pd[22]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_23 (.A(pwrbus_ram_pd[23]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_24 (.A(pwrbus_ram_pd[24]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_25 (.A(pwrbus_ram_pd[25]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_26 (.A(pwrbus_ram_pd[26]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_27 (.A(pwrbus_ram_pd[27]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_28 (.A(pwrbus_ram_pd[28]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_29 (.A(pwrbus_ram_pd[29]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_30 (.A(pwrbus_ram_pd[30]));
NV_BLKBOX_SINK UJ_BBOX2UNIT_UNUSED_pwrbus_31 (.A(pwrbus_ram_pd[31]));
reg [4:0] Ra_array_reg_r0;
// Declare the Data_reg signal beforehand
// verilint 498 off - not all bits are used
reg [3:0] Data_reg_r0;
// Data out bus for read port r0 for Output Mux
wire [3:0] r0_OutputMuxDataOut;
reg [4:0] Ra_reg_r0;
// Write enable bus
wire we_0_0;
// start of predeclareNvregSignals
wire ctx_ctrl_we;
wire [4:0] D_Ra_array_reg_r0;
wire [4:0] la_muxedRa_r0;
assign D_Ra_array_reg_r0 = ( ((re))) ? ra : Ra_array_reg_r0;
always @(posedge clk) begin
    Ra_array_reg_r0 <= D_Ra_array_reg_r0;
 end
assign la_muxedRa_r0 = Ra_array_reg_r0;
// ------------------ START PIECE ----------------------------------
// Suffix : Piece Flop_Array (FlopArray)
// Covers Addresses from 0 to 19 Addressrange: [4:0]
// Data Bit range: [3:0] (4 bits)
// Enables: 1 Enable range:
// Write Address bus
wire [4:0] wa_0_0;
assign wa_0_0 = wa;
// Write Data in bus
wire [3:0] di_0_0;
assign di_0_0 = di[3:0];
assign we_0_0 = we;
// Read Address bus
wire [4:0] ra_0_0;
assign ra_0_0 = la_muxedRa_r0;
// Read DataOut bus
wire [3:0] dout_0_0;
// begin ---------------- Flop_Array ---------------
// Declare the register array
reg [3:0] FlopArray_row0;
reg [3:0] FlopArray_row1;
reg [3:0] FlopArray_row2;
reg [3:0] FlopArray_row3;
reg [3:0] FlopArray_row4;
reg [3:0] FlopArray_row5;
reg [3:0] FlopArray_row6;
reg [3:0] FlopArray_row7;
reg [3:0] FlopArray_row8;
reg [3:0] FlopArray_row9;
reg [3:0] FlopArray_row10;
reg [3:0] FlopArray_row11;
reg [3:0] FlopArray_row12;
reg [3:0] FlopArray_row13;
reg [3:0] FlopArray_row14;
reg [3:0] FlopArray_row15;
reg [3:0] FlopArray_row16;
reg [3:0] FlopArray_row17;
reg [3:0] FlopArray_row18;
reg [3:0] FlopArray_row19;
// Declare the Write port wires
// Write Data wires
wire [3:0] Wdata;
// Assign for data input
assign Wdata = di_0_0;
// Address decode for Flop array
wire [19:0] Wa_decode;
// Create wire for one write enable
wire We;
assign We = we_0_0;
assign Wa_decode[0] = We & (wa_0_0 == 5'd0);
assign Wa_decode[1] = We & (wa_0_0 == 5'd1);
assign Wa_decode[2] = We & (wa_0_0 == 5'd2);
assign Wa_decode[3] = We & (wa_0_0 == 5'd3);
assign Wa_decode[4] = We & (wa_0_0 == 5'd4);
assign Wa_decode[5] = We & (wa_0_0 == 5'd5);
assign Wa_decode[6] = We & (wa_0_0 == 5'd6);
assign Wa_decode[7] = We & (wa_0_0 == 5'd7);
assign Wa_decode[8] = We & (wa_0_0 == 5'd8);
assign Wa_decode[9] = We & (wa_0_0 == 5'd9);
assign Wa_decode[10] = We & (wa_0_0 == 5'd10);
assign Wa_decode[11] = We & (wa_0_0 == 5'd11);
assign Wa_decode[12] = We & (wa_0_0 == 5'd12);
assign Wa_decode[13] = We & (wa_0_0 == 5'd13);
assign Wa_decode[14] = We & (wa_0_0 == 5'd14);
assign Wa_decode[15] = We & (wa_0_0 == 5'd15);
assign Wa_decode[16] = We & (wa_0_0 == 5'd16);
assign Wa_decode[17] = We & (wa_0_0 == 5'd17);
assign Wa_decode[18] = We & (wa_0_0 == 5'd18);
assign Wa_decode[19] = We & (wa_0_0 == 5'd19);
reg [3:0] RaDecodeDor0;
// Assign the input data to the flop input
wire [3:0] FlopArray_row0_d;
assign FlopArray_row0_d = (Wa_decode[0]) ? Wdata : FlopArray_row0;
wire [3:0] FlopArray_row1_d;
assign FlopArray_row1_d = (Wa_decode[1]) ? Wdata : FlopArray_row1;
wire [3:0] FlopArray_row2_d;
assign FlopArray_row2_d = (Wa_decode[2]) ? Wdata : FlopArray_row2;
wire [3:0] FlopArray_row3_d;
assign FlopArray_row3_d = (Wa_decode[3]) ? Wdata : FlopArray_row3;
wire [3:0] FlopArray_row4_d;
assign FlopArray_row4_d = (Wa_decode[4]) ? Wdata : FlopArray_row4;
wire [3:0] FlopArray_row5_d;
assign FlopArray_row5_d = (Wa_decode[5]) ? Wdata : FlopArray_row5;
wire [3:0] FlopArray_row6_d;
assign FlopArray_row6_d = (Wa_decode[6]) ? Wdata : FlopArray_row6;
wire [3:0] FlopArray_row7_d;
assign FlopArray_row7_d = (Wa_decode[7]) ? Wdata : FlopArray_row7;
wire [3:0] FlopArray_row8_d;
assign FlopArray_row8_d = (Wa_decode[8]) ? Wdata : FlopArray_row8;
wire [3:0] FlopArray_row9_d;
assign FlopArray_row9_d = (Wa_decode[9]) ? Wdata : FlopArray_row9;
wire [3:0] FlopArray_row10_d;
assign FlopArray_row10_d = (Wa_decode[10]) ? Wdata : FlopArray_row10;
wire [3:0] FlopArray_row11_d;
assign FlopArray_row11_d = (Wa_decode[11]) ? Wdata : FlopArray_row11;
wire [3:0] FlopArray_row12_d;
assign FlopArray_row12_d = (Wa_decode[12]) ? Wdata : FlopArray_row12;
wire [3:0] FlopArray_row13_d;
assign FlopArray_row13_d = (Wa_decode[13]) ? Wdata : FlopArray_row13;
wire [3:0] FlopArray_row14_d;
assign FlopArray_row14_d = (Wa_decode[14]) ? Wdata : FlopArray_row14;
wire [3:0] FlopArray_row15_d;
assign FlopArray_row15_d = (Wa_decode[15]) ? Wdata : FlopArray_row15;
wire [3:0] FlopArray_row16_d;
assign FlopArray_row16_d = (Wa_decode[16]) ? Wdata : FlopArray_row16;
wire [3:0] FlopArray_row17_d;
assign FlopArray_row17_d = (Wa_decode[17]) ? Wdata : FlopArray_row17;
wire [3:0] FlopArray_row18_d;
assign FlopArray_row18_d = (Wa_decode[18]) ? Wdata : FlopArray_row18;
wire [3:0] FlopArray_row19_d;
assign FlopArray_row19_d = (Wa_decode[19]) ? Wdata : FlopArray_row19;
always @(posedge clk) begin
   FlopArray_row0 <= FlopArray_row0_d;
   FlopArray_row1 <= FlopArray_row1_d;
   FlopArray_row2 <= FlopArray_row2_d;
   FlopArray_row3 <= FlopArray_row3_d;
   FlopArray_row4 <= FlopArray_row4_d;
   FlopArray_row5 <= FlopArray_row5_d;
   FlopArray_row6 <= FlopArray_row6_d;
   FlopArray_row7 <= FlopArray_row7_d;
   FlopArray_row8 <= FlopArray_row8_d;
   FlopArray_row9 <= FlopArray_row9_d;
   FlopArray_row10 <= FlopArray_row10_d;
   FlopArray_row11 <= FlopArray_row11_d;
   FlopArray_row12 <= FlopArray_row12_d;
   FlopArray_row13 <= FlopArray_row13_d;
   FlopArray_row14 <= FlopArray_row14_d;
   FlopArray_row15 <= FlopArray_row15_d;
   FlopArray_row16 <= FlopArray_row16_d;
   FlopArray_row17 <= FlopArray_row17_d;
   FlopArray_row18 <= FlopArray_row18_d;
   FlopArray_row19 <= FlopArray_row19_d;
end
// Declare the Do buses for data out.
// Do Ra decode
always @(ra_0_0 or FlopArray_row0 or FlopArray_row1 or FlopArray_row2 or
         FlopArray_row3 or FlopArray_row4 or FlopArray_row5 or FlopArray_row6 or
         FlopArray_row7 or FlopArray_row8 or FlopArray_row9 or FlopArray_row10 or
         FlopArray_row11 or FlopArray_row12 or FlopArray_row13 or
         FlopArray_row14 or FlopArray_row15 or FlopArray_row16 or
         FlopArray_row17 or FlopArray_row18 or FlopArray_row19)
// verilint 332 off - not all cases covered, default exists
   case(ra_0_0)
       5'd0 : RaDecodeDor0 = FlopArray_row0;
       5'd1 : RaDecodeDor0 = FlopArray_row1;
       5'd2 : RaDecodeDor0 = FlopArray_row2;
       5'd3 : RaDecodeDor0 = FlopArray_row3;
       5'd4 : RaDecodeDor0 = FlopArray_row4;
       5'd5 : RaDecodeDor0 = FlopArray_row5;
       5'd6 : RaDecodeDor0 = FlopArray_row6;
       5'd7 : RaDecodeDor0 = FlopArray_row7;
       5'd8 : RaDecodeDor0 = FlopArray_row8;
       5'd9 : RaDecodeDor0 = FlopArray_row9;
       5'd10 : RaDecodeDor0 = FlopArray_row10;
       5'd11 : RaDecodeDor0 = FlopArray_row11;
       5'd12 : RaDecodeDor0 = FlopArray_row12;
       5'd13 : RaDecodeDor0 = FlopArray_row13;
       5'd14 : RaDecodeDor0 = FlopArray_row14;
       5'd15 : RaDecodeDor0 = FlopArray_row15;
       5'd16 : RaDecodeDor0 = FlopArray_row16;
       5'd17 : RaDecodeDor0 = FlopArray_row17;
       5'd18 : RaDecodeDor0 = FlopArray_row18;
       5'd19 : RaDecodeDor0 = FlopArray_row19;
       default :RaDecodeDor0 = {4{`tick_x_or_0}};
    endcase
// verilint 332 on
assign dout_0_0 = RaDecodeDor0;
//------------ Done generating flop array Flop_Array -------------
// ---------------------------------------------
// Declare the interface wires for Output Mux logic
// verilint 552 off - Different bits of a net are driven in different blocks (harmless,
// but some synthesis tools generate a warning for this)
reg [3:0] ram_r0_OutputMuxDataOut;
//For bitEnd 3, only one piece Flop_Array in the column.
// verilint 17 off - Range (rather than full vector) in the sensitivity list
always @(dout_0_0)
      ram_r0_OutputMuxDataOut[3:0] = dout_0_0;
assign r0_OutputMuxDataOut[3:0] = ram_r0_OutputMuxDataOut[3:0];
// verilint 17 on - Range (rather than full vector) in the sensitivity list
// --------------------- Output Mbist Interface logic -------------
wire [3:0] functional_byp_r0_OutputMuxDataOut = (byp_sel) ? dbyp : r0_OutputMuxDataOut;
wire [3:0] muxed_r0_OutputMuxDataOut;
assign muxed_r0_OutputMuxDataOut = ( | (byp_sel)) ? functional_byp_r0_OutputMuxDataOut : r0_OutputMuxDataOut;
wire captureDR_r0 = ((((ore))) || ( 1'b0 ));
////MSB 3 LSB 0  and total rambit is 0 and  dsize is 4
always @(posedge clk) begin
    if (captureDR_r0)
       Data_reg_r0[3:0] <= muxed_r0_OutputMuxDataOut[3:0];
end
assign dout = Data_reg_r0;
// Ram access scan chain
`ifdef ASSERT_ON
`ifndef SYNTHESIS
reg sim_reset_;
initial sim_reset_ = 0;
always @(posedge clk) sim_reset_ <= 1'b1;
wire start_of_sim = sim_reset_;
wire disable_clk_x_test = $test$plusargs ("disable_clk_x_test") ? 1'b1 : 1'b0;
nv_assert_no_x #(1,1,0," Try Reading Ram when clock is x for read port r0") _clk_x_test_read (clk, sim_reset_, ((disable_clk_x_test===1'b0) && (|re===1'b1 )), clk);
nv_assert_no_x #(1,1,0," Try Writing Ram when clock is x for write port w0") _clk_x_test_write (clk, sim_reset_, ((disable_clk_x_test===1'b0) && (|we===1'b1)), clk);
`endif // SYNTHESIS 
`endif // ASSERT_ON
`ifdef ASSERT_ON
`ifndef SYNTHESIS
`endif
`endif
`ifdef ASSERT_ON
`ifndef SYNTHESIS
wire pwrbus_assertion_not_x_while_active = $test$plusargs ("pwrbus_assertion_not_x_while_active");
nv_assert_never #(0, 0, "Power bus cannot be X when read/write enable is set") _pwrbus_assertion_not_x_while_active_we ( we, sim_reset_ && !pwrbus_assertion_not_x_while_active, ^pwrbus_ram_pd === 1'bx);
nv_assert_never #(0, 0, "Power bus cannot be X when read/write enable is set") _pwrbus_assertion_not_x_while_active_re ( re, sim_reset_ && !pwrbus_assertion_not_x_while_active, ^pwrbus_ram_pd === 1'bx);
`endif
`endif
// submodule done
endmodule