2024-05-20 11:26:04 -05:00
|
|
|
(* abc9_box, lib_whitebox *)
|
2024-05-10 04:15:56 -05:00
|
|
|
module NX_GCK_U(SI1, SI2, CMD, SO);
|
|
|
|
input CMD;
|
|
|
|
input SI1;
|
|
|
|
input SI2;
|
|
|
|
output SO;
|
|
|
|
parameter inv_in = 1'b0;
|
|
|
|
parameter inv_out = 1'b0;
|
|
|
|
parameter std_mode = "BYPASS";
|
|
|
|
|
|
|
|
wire SI1_int = inv_in ? ~SI1 : SI1;
|
|
|
|
wire SI2_int = inv_in ? ~SI2 : SI2;
|
|
|
|
|
|
|
|
wire SO_int;
|
2024-07-24 06:41:12 -05:00
|
|
|
generate
|
|
|
|
if (std_mode == "BYPASS") begin
|
|
|
|
assign SO_int = SI1_int;
|
|
|
|
end
|
|
|
|
else if (std_mode == "MUX") begin
|
|
|
|
assign SO_int = CMD ? SI1_int : SI2_int;
|
|
|
|
end
|
|
|
|
else if (std_mode == "CKS") begin
|
|
|
|
assign SO_int = CMD ? SI1_int : 1'b0;
|
|
|
|
end
|
|
|
|
else if (std_mode == "CSC") begin
|
|
|
|
assign SO_int = CMD;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
$error("Unrecognised std_mode");
|
2024-05-10 04:15:56 -05:00
|
|
|
endgenerate
|
|
|
|
assign SO = inv_out ? ~SO_int : SO_int;
|
|
|
|
endmodule
|
2024-05-20 11:26:04 -05:00
|
|
|
|
|
|
|
(* abc9_box, lib_whitebox *)
|
|
|
|
module NX_RFB_U(WCK, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20
|
|
|
|
, I21, I22, I23, I24, I25, I26, I27, I28, I29, I30, I31, I32, I33, I34, I35, I36, O1, O2, O3, O4, O5
|
|
|
|
, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17, O18, O19, O20, O21, O22, O23, O24, O25, O26
|
|
|
|
, O27, O28, O29, O30, O31, O32, O33, O34, O35, O36, RA1, RA2, RA3, RA4, RA5, RA6, RA7, RA8, RA9, RA10, WA1
|
|
|
|
, WA2, WA3, WA4, WA5, WA6, WE, WEA);
|
|
|
|
input I1;
|
|
|
|
input I10;
|
|
|
|
input I11;
|
|
|
|
input I12;
|
|
|
|
input I13;
|
|
|
|
input I14;
|
|
|
|
input I15;
|
|
|
|
input I16;
|
|
|
|
input I17;
|
|
|
|
input I18;
|
|
|
|
input I19;
|
|
|
|
input I2;
|
|
|
|
input I20;
|
|
|
|
input I21;
|
|
|
|
input I22;
|
|
|
|
input I23;
|
|
|
|
input I24;
|
|
|
|
input I25;
|
|
|
|
input I26;
|
|
|
|
input I27;
|
|
|
|
input I28;
|
|
|
|
input I29;
|
|
|
|
input I3;
|
|
|
|
input I30;
|
|
|
|
input I31;
|
|
|
|
input I32;
|
|
|
|
input I33;
|
|
|
|
input I34;
|
|
|
|
input I35;
|
|
|
|
input I36;
|
|
|
|
input I4;
|
|
|
|
input I5;
|
|
|
|
input I6;
|
|
|
|
input I7;
|
|
|
|
input I8;
|
|
|
|
input I9;
|
|
|
|
output O1;
|
|
|
|
output O10;
|
|
|
|
output O11;
|
|
|
|
output O12;
|
|
|
|
output O13;
|
|
|
|
output O14;
|
|
|
|
output O15;
|
|
|
|
output O16;
|
|
|
|
output O17;
|
|
|
|
output O18;
|
|
|
|
output O19;
|
|
|
|
output O2;
|
|
|
|
output O20;
|
|
|
|
output O21;
|
|
|
|
output O22;
|
|
|
|
output O23;
|
|
|
|
output O24;
|
|
|
|
output O25;
|
|
|
|
output O26;
|
|
|
|
output O27;
|
|
|
|
output O28;
|
|
|
|
output O29;
|
|
|
|
output O3;
|
|
|
|
output O30;
|
|
|
|
output O31;
|
|
|
|
output O32;
|
|
|
|
output O33;
|
|
|
|
output O34;
|
|
|
|
output O35;
|
|
|
|
output O36;
|
|
|
|
output O4;
|
|
|
|
output O5;
|
|
|
|
output O6;
|
|
|
|
output O7;
|
|
|
|
output O8;
|
|
|
|
output O9;
|
|
|
|
input RA1;
|
|
|
|
input RA10;
|
|
|
|
input RA2;
|
|
|
|
input RA3;
|
|
|
|
input RA4;
|
|
|
|
input RA5;
|
|
|
|
input RA6;
|
|
|
|
input RA7;
|
|
|
|
input RA8;
|
|
|
|
input RA9;
|
|
|
|
input WA1;
|
|
|
|
input WA2;
|
|
|
|
input WA3;
|
|
|
|
input WA4;
|
|
|
|
input WA5;
|
|
|
|
input WA6;
|
|
|
|
input WCK;
|
|
|
|
input WE;
|
|
|
|
input WEA;
|
|
|
|
parameter mem_ctxt = "";
|
|
|
|
parameter mode = 0;
|
|
|
|
parameter wck_edge = 1'b0;
|
|
|
|
|
|
|
|
wire clock = WCK ^ wck_edge;
|
|
|
|
|
|
|
|
localparam MEM_SIZE = mode == 2 ? 64 : 32;
|
|
|
|
localparam MEM_WIDTH = mode == 3 ? 36 : 18;
|
|
|
|
localparam ADDR_WIDTH = mode == 2 ? 6 : 5;
|
2024-07-11 10:43:46 -05:00
|
|
|
localparam DATA_SIZE = MEM_SIZE * MEM_WIDTH;
|
|
|
|
localparam MAX_SIZE = DATA_SIZE + MEM_SIZE + 1;
|
2024-05-20 11:26:04 -05:00
|
|
|
|
|
|
|
reg [MEM_WIDTH-1:0] mem [MEM_SIZE-1:0];
|
|
|
|
|
2024-07-11 10:43:46 -05:00
|
|
|
function [DATA_SIZE-1:0] convert_initval;
|
|
|
|
input [8*MAX_SIZE-1:0] hex_initval;
|
|
|
|
reg done;
|
|
|
|
reg [DATA_SIZE-1:0] temp;
|
|
|
|
reg [7:0] char;
|
|
|
|
integer i,j;
|
|
|
|
begin
|
|
|
|
done = 1'b0;
|
|
|
|
temp = 0;
|
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < MAX_SIZE; i = i + 1) begin
|
|
|
|
char = hex_initval[8*i +: 8];
|
|
|
|
if (char >= "0" && char <= "1") begin
|
|
|
|
temp[j] = char - "0";
|
|
|
|
j = j + 1;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
convert_initval = temp;
|
|
|
|
end
|
|
|
|
endfunction
|
|
|
|
|
2024-05-20 11:26:04 -05:00
|
|
|
integer i;
|
2024-07-11 10:43:46 -05:00
|
|
|
reg [DATA_SIZE-1:0] mem_data;
|
2024-05-20 11:26:04 -05:00
|
|
|
initial begin
|
2024-07-11 10:43:46 -05:00
|
|
|
mem_data = convert_initval(mem_ctxt);
|
2024-05-20 11:26:04 -05:00
|
|
|
for (i = 0; i < MEM_SIZE; i = i + 1)
|
2024-07-11 10:43:46 -05:00
|
|
|
mem[i] = mem_data[MEM_WIDTH*(MEM_SIZE-i-1) +: MEM_WIDTH];
|
2024-05-20 11:26:04 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
wire [ADDR_WIDTH-1:0] WA = (mode==2) ? { WA6, WA5, WA4, WA3, WA2, WA1 } : { WA5, WA4, WA3, WA2, WA1 };
|
|
|
|
wire [36-1:0] O = { O36, O35, O34, O33, O32, O31, O30, O29, O28,
|
|
|
|
O27, O26, O25, O24, O23, O22, O21, O20, O19,
|
|
|
|
O18, O17, O16, O15, O14, O13, O12, O11, O10,
|
|
|
|
O9, O8, O7, O6, O5, O4, O3, O2, O1 };
|
|
|
|
wire [36-1:0] I = { I36, I35, I34, I33, I32, I31, I30, I29, I28,
|
|
|
|
I27, I26, I25, I24, I23, I22, I21, I20, I19,
|
|
|
|
I18, I17, I16, I15, I14, I13, I12, I11, I10,
|
|
|
|
I9, I8, I7, I6, I5, I4, I3, I2, I1 };
|
|
|
|
generate
|
|
|
|
if (mode==0) begin
|
2024-07-24 06:34:41 -05:00
|
|
|
assign O = mem[{ RA5, RA4, RA3, RA2, RA1 }];
|
2024-05-20 11:26:04 -05:00
|
|
|
end
|
|
|
|
else if (mode==1) begin
|
2024-07-24 06:34:41 -05:00
|
|
|
assign O = mem[{ WA5, WA4, WA3, WA2, WA1 }];
|
2024-05-20 11:26:04 -05:00
|
|
|
end
|
|
|
|
else if (mode==2) begin
|
2024-07-24 06:34:41 -05:00
|
|
|
assign O = mem[{ RA6, RA5, RA4, RA3, RA2, RA1 }];
|
2024-05-20 11:26:04 -05:00
|
|
|
end
|
|
|
|
else if (mode==3) begin
|
2024-07-24 06:34:41 -05:00
|
|
|
assign O = mem[{ RA5, RA4, RA3, RA2, RA1 }];
|
2024-05-20 11:26:04 -05:00
|
|
|
end
|
|
|
|
else if (mode==4) begin
|
2024-07-24 06:34:41 -05:00
|
|
|
assign O = { mem[{ RA10, RA9, RA8, RA7, RA6 }], mem[{ RA5, RA4, RA3, RA2, RA1 }] };
|
2024-05-20 11:26:04 -05:00
|
|
|
end
|
|
|
|
else
|
|
|
|
$error("Unknown NX_RFB_U mode");
|
|
|
|
endgenerate
|
|
|
|
|
|
|
|
always @(posedge clock)
|
|
|
|
if (WE)
|
|
|
|
mem[WA] <= I[MEM_WIDTH-1:0];
|
2024-05-22 08:45:18 -05:00
|
|
|
endmodule
|
|
|
|
|
|
|
|
(* abc9_box, lib_whitebox *)
|
|
|
|
module NX_WFG_U(R, SI, ZI, SO, ZO);
|
|
|
|
input R;
|
|
|
|
input SI;
|
|
|
|
output SO;
|
|
|
|
input ZI;
|
|
|
|
output ZO;
|
|
|
|
parameter delay = 0;
|
|
|
|
parameter delay_on = 1'b0;
|
|
|
|
parameter div_phase = 1'b0;
|
|
|
|
parameter div_ratio = 0;
|
|
|
|
parameter location = "";
|
|
|
|
parameter mode = 0;
|
|
|
|
parameter pattern = 16'b0000000000000000;
|
|
|
|
parameter pattern_end = 0;
|
|
|
|
parameter reset_on_cal_lock_n = 1'b0;
|
|
|
|
parameter reset_on_pll_lock_n = 1'b0;
|
|
|
|
parameter reset_on_pll_locka_n = 1'b0;
|
|
|
|
parameter wfg_edge = 1'b0;
|
|
|
|
|
|
|
|
generate
|
|
|
|
if (mode==0) begin
|
|
|
|
assign SO = SI;
|
|
|
|
end
|
|
|
|
else if (mode==1) begin
|
|
|
|
wire clock = ZI ^ wfg_edge;
|
|
|
|
wire reset = R || SI;
|
|
|
|
reg [3:0] counter = 0;
|
|
|
|
reg [15:0] rom = pattern;
|
|
|
|
|
|
|
|
always @(posedge clock)
|
|
|
|
begin
|
|
|
|
if (reset)
|
|
|
|
counter <= 4'b0;
|
|
|
|
else
|
|
|
|
counter <= counter + 1;
|
|
|
|
end
|
|
|
|
assign SO = counter == pattern_end;
|
|
|
|
assign ZO = rom[counter];
|
|
|
|
end
|
|
|
|
else if (mode==2) begin
|
|
|
|
end
|
|
|
|
else
|
|
|
|
$error("Unknown NX_WFG_U mode");
|
|
|
|
endgenerate
|
|
|
|
endmodule
|
2024-07-24 06:00:56 -05:00
|
|
|
|
|
|
|
module NX_DDFR_U(CK,CKF,R,I,I2,L,O,O2);
|
|
|
|
input CK;
|
|
|
|
input CKF;
|
|
|
|
input R;
|
|
|
|
input I;
|
|
|
|
input I2;
|
|
|
|
input L;
|
|
|
|
output O;
|
|
|
|
output O2;
|
|
|
|
|
|
|
|
parameter location = "";
|
|
|
|
parameter path = 0;
|
|
|
|
parameter dff_type = 1'b0;
|
|
|
|
parameter dff_sync = 1'b0;
|
|
|
|
parameter dff_load = 1'b0;
|
|
|
|
|
|
|
|
wire load = dff_load ? 1'b1 : L; // reversed when compared to DFF
|
|
|
|
wire async_reset = !dff_sync && R;
|
|
|
|
wire sync_reset = dff_sync && R;
|
|
|
|
|
|
|
|
generate
|
|
|
|
if (path==1) begin
|
|
|
|
// IDDFR
|
|
|
|
always @(posedge CK, posedge async_reset)
|
|
|
|
if (async_reset) O <= dff_type;
|
|
|
|
else if (sync_reset) O <= dff_type;
|
|
|
|
else if (load) O <= I;
|
|
|
|
|
|
|
|
always @(posedge CKF, posedge async_reset)
|
|
|
|
if (async_reset) O2 <= dff_type;
|
|
|
|
else if (sync_reset) O2 <= dff_type;
|
|
|
|
else if (load) O2 <= I;
|
|
|
|
end
|
|
|
|
else if (path==0 || path==2) begin
|
|
|
|
reg q1, q2;
|
|
|
|
// ODDFR
|
|
|
|
always @(posedge CK, posedge async_reset)
|
|
|
|
if (async_reset) q1 <= dff_type;
|
|
|
|
else if (sync_reset) q1 <= dff_type;
|
|
|
|
else if (load) q1 <= I;
|
|
|
|
|
|
|
|
always @(posedge CKF, posedge async_reset)
|
|
|
|
if (async_reset) q2 <= dff_type;
|
|
|
|
else if (sync_reset) q2 <= dff_type;
|
|
|
|
else if (load) q2 <= I2;
|
|
|
|
|
|
|
|
assign O = CK ? q1 : q2;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
$error("Unknown NX_DDFR_U path");
|
|
|
|
endgenerate
|
|
|
|
endmodule
|