mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 19:22:31 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			306 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			306 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
| (* abc9_box, lib_whitebox *)
 | |
| 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;
 | |
|     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");
 | |
|     endgenerate
 | |
|     assign SO = inv_out ? ~SO_int : SO_int;
 | |
| endmodule
 | |
| 
 | |
| (* 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;
 | |
|     localparam DATA_SIZE = MEM_SIZE * MEM_WIDTH;
 | |
|     localparam MAX_SIZE = DATA_SIZE + MEM_SIZE + 1;
 | |
| 
 | |
|     reg [MEM_WIDTH-1:0] mem [MEM_SIZE-1:0];
 | |
| 
 | |
| 	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
 | |
| 
 | |
|     integer i;
 | |
|     reg [DATA_SIZE-1:0] mem_data;
 | |
|     initial begin
 | |
|         mem_data = convert_initval(mem_ctxt);
 | |
|         for (i = 0; i < MEM_SIZE; i = i + 1)
 | |
|             mem[i] = mem_data[MEM_WIDTH*(MEM_SIZE-i-1) +: MEM_WIDTH];
 | |
|     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
 | |
|             assign O = mem[{ RA5, RA4, RA3, RA2, RA1 }];
 | |
|         end
 | |
|         else if (mode==1) begin
 | |
|             assign O = mem[{ WA5, WA4, WA3, WA2, WA1 }];
 | |
|         end
 | |
|         else if (mode==2) begin
 | |
|             assign O = mem[{ RA6, RA5, RA4, RA3, RA2, RA1 }];
 | |
|         end
 | |
|         else if (mode==3) begin
 | |
|             assign O = mem[{ RA5, RA4, RA3, RA2, RA1 }];
 | |
|         end
 | |
|         else if (mode==4) begin
 | |
|             assign O = { mem[{ RA10, RA9, RA8, RA7, RA6 }], mem[{ RA5, RA4, RA3, RA2, RA1 }] };
 | |
|         end
 | |
|         else 
 | |
|             $error("Unknown NX_RFB_U mode");
 | |
|     endgenerate
 | |
| 
 | |
|     always @(posedge clock)
 | |
|         if (WE)
 | |
|             mem[WA] <= I[MEM_WIDTH-1:0];
 | |
| 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
 | |
| 
 | |
| 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
 |