mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	Merge pull request #1379 from mmicko/sim_models
Added simulation models for Efinix and Anlogic
This commit is contained in:
		
						commit
						3ec28ec53a
					
				
					 2 changed files with 162 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
module AL_MAP_SEQ (
 | 
			
		||||
	output q,
 | 
			
		||||
	output reg q,
 | 
			
		||||
	input ce,
 | 
			
		||||
	input clk,
 | 
			
		||||
	input sr,
 | 
			
		||||
| 
						 | 
				
			
			@ -9,6 +9,71 @@ module AL_MAP_SEQ (
 | 
			
		|||
	parameter REGSET = "RESET"; //RESET/SET
 | 
			
		||||
	parameter SRMUX = "SR"; //SR/INV
 | 
			
		||||
	parameter SRMODE = "SYNC"; //SYNC/ASYNC
 | 
			
		||||
 | 
			
		||||
	wire clk_ce;
 | 
			
		||||
	assign clk_ce = ce ? clk : 1'b0;
 | 
			
		||||
 | 
			
		||||
	wire srmux;
 | 
			
		||||
	generate
 | 
			
		||||
		case (SRMUX)
 | 
			
		||||
			"SR": assign srmux = sr;
 | 
			
		||||
			"INV": assign srmux = ~sr;
 | 
			
		||||
			default: assign srmux = sr;
 | 
			
		||||
		endcase
 | 
			
		||||
	endgenerate	
 | 
			
		||||
 | 
			
		||||
	wire regset;
 | 
			
		||||
	generate
 | 
			
		||||
		case (REGSET)
 | 
			
		||||
			"RESET": assign regset = 1'b0;
 | 
			
		||||
			"SET": assign regset = 1'b1;
 | 
			
		||||
			default: assign regset = 1'b0;
 | 
			
		||||
		endcase
 | 
			
		||||
	endgenerate
 | 
			
		||||
 | 
			
		||||
	initial q = regset;
 | 
			
		||||
 | 
			
		||||
	generate
 | 
			
		||||
   		if (DFFMODE == "FF") 
 | 
			
		||||
		begin
 | 
			
		||||
			if (SRMODE == "ASYNC") 
 | 
			
		||||
			begin
 | 
			
		||||
				always @(posedge clk_ce, posedge srmux)
 | 
			
		||||
					if (srmux)
 | 
			
		||||
						q <= regset;
 | 
			
		||||
					else 
 | 
			
		||||
						q <= d;	
 | 
			
		||||
			end 
 | 
			
		||||
			else
 | 
			
		||||
			begin
 | 
			
		||||
				always @(posedge clk_ce)
 | 
			
		||||
					if (srmux)
 | 
			
		||||
						q <= regset;
 | 
			
		||||
					else 
 | 
			
		||||
						q <= d;	
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		else
 | 
			
		||||
		begin
 | 
			
		||||
			// DFFMODE == "LATCH"
 | 
			
		||||
			if (SRMODE == "ASYNC") 
 | 
			
		||||
			begin
 | 
			
		||||
				always @(clk_ce, srmux)
 | 
			
		||||
					if (srmux)
 | 
			
		||||
						q <= regset;
 | 
			
		||||
					else 
 | 
			
		||||
						q <= d;	
 | 
			
		||||
			end 
 | 
			
		||||
			else
 | 
			
		||||
			begin
 | 
			
		||||
				always @(clk_ce)
 | 
			
		||||
					if (srmux)
 | 
			
		||||
						q <= regset;
 | 
			
		||||
					else 
 | 
			
		||||
						q <= d;	
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
    endgenerate
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module AL_MAP_LUT1 (
 | 
			
		||||
| 
						 | 
				
			
			@ -17,7 +82,8 @@ module AL_MAP_LUT1 (
 | 
			
		|||
);
 | 
			
		||||
	parameter [1:0] INIT = 2'h0;
 | 
			
		||||
	parameter EQN = "(A)";
 | 
			
		||||
	assign o = INIT >> a;
 | 
			
		||||
 | 
			
		||||
	assign o = a ? INIT[1] : INIT[0];	
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module AL_MAP_LUT2 (
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +93,9 @@ module AL_MAP_LUT2 (
 | 
			
		|||
);
 | 
			
		||||
	parameter [3:0] INIT = 4'h0;
 | 
			
		||||
	parameter EQN = "(A)";
 | 
			
		||||
	assign o = INIT >> {b, a};
 | 
			
		||||
 | 
			
		||||
	wire [1:0] s1 = b ? INIT[ 3:2] : INIT[1:0];
 | 
			
		||||
	assign o = a ? s1[1] : s1[0];	
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module AL_MAP_LUT3 (
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +106,10 @@ module AL_MAP_LUT3 (
 | 
			
		|||
);
 | 
			
		||||
	parameter [7:0] INIT = 8'h0;
 | 
			
		||||
	parameter EQN = "(A)";
 | 
			
		||||
	assign o = INIT >> {c, b, a};
 | 
			
		||||
 | 
			
		||||
	wire [3:0] s2 = c ? INIT[ 7:4] : INIT[3:0];
 | 
			
		||||
	wire [1:0] s1 = b ?   s2[ 3:2] :   s2[1:0];
 | 
			
		||||
	assign o = a ? s1[1] : s1[0];	
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module AL_MAP_LUT4 (
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +121,11 @@ module AL_MAP_LUT4 (
 | 
			
		|||
);
 | 
			
		||||
	parameter [15:0] INIT = 16'h0;
 | 
			
		||||
	parameter EQN = "(A)";
 | 
			
		||||
	assign o = INIT >> {d, c, b, a};
 | 
			
		||||
 | 
			
		||||
	wire [7:0] s3 = d ? INIT[15:8] : INIT[7:0];
 | 
			
		||||
	wire [3:0] s2 = c ?   s3[ 7:4] :   s3[3:0];
 | 
			
		||||
	wire [1:0] s1 = b ?   s2[ 3:2] :   s2[1:0];
 | 
			
		||||
	assign o = a ? s1[1] : s1[0];	
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module AL_MAP_LUT5 (
 | 
			
		||||
| 
						 | 
				
			
			@ -100,4 +175,18 @@ module AL_MAP_ADDER (
 | 
			
		|||
  output [1:0] o
 | 
			
		||||
);
 | 
			
		||||
	parameter ALUTYPE = "ADD";
 | 
			
		||||
 | 
			
		||||
	generate
 | 
			
		||||
		case (ALUTYPE)
 | 
			
		||||
			"ADD": 		 assign o = a + b + c;
 | 
			
		||||
			"SUB": 		 assign o = a - b - c;
 | 
			
		||||
			"A_LE_B":    assign o = a - b - c;
 | 
			
		||||
 | 
			
		||||
			"ADD_CARRY":    assign o = {  a, 1'b0 };
 | 
			
		||||
			"SUB_CARRY":    assign o = { ~a, 1'b0 };
 | 
			
		||||
			"A_LE_B_CARRY": assign o = {  a, 1'b0 };
 | 
			
		||||
			default: assign o = a + b + c;
 | 
			
		||||
		endcase
 | 
			
		||||
	endgenerate	
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,12 @@ module EFX_LUT4(
 | 
			
		|||
   input I2,
 | 
			
		||||
   input I3
 | 
			
		||||
);
 | 
			
		||||
   parameter LUTMASK  = 16'h0000;
 | 
			
		||||
	parameter LUTMASK = 16'h0000;
 | 
			
		||||
 | 
			
		||||
	wire [7:0] s3 = I3 ? LUTMASK[15:8] : LUTMASK[7:0];
 | 
			
		||||
	wire [3:0] s2 = I2 ?      s3[ 7:4] :      s3[3:0];
 | 
			
		||||
	wire [1:0] s1 = I1 ?      s2[ 3:2] :      s2[1:0];
 | 
			
		||||
	assign O = I0 ? s1[1] : s1[0];	   
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module EFX_ADD(
 | 
			
		||||
| 
						 | 
				
			
			@ -17,10 +22,18 @@ module EFX_ADD(
 | 
			
		|||
);
 | 
			
		||||
   parameter I0_POLARITY   = 1;
 | 
			
		||||
   parameter I1_POLARITY   = 1;
 | 
			
		||||
 | 
			
		||||
   wire i0;
 | 
			
		||||
   wire i1;
 | 
			
		||||
 | 
			
		||||
   assign i0 = I0_POLARITY ? I0 : ~I0;
 | 
			
		||||
   assign i1 = I1_POLARITY ? I1 : ~I1;
 | 
			
		||||
 | 
			
		||||
   assign {CO, O} = i0 + i1 + CI;
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module EFX_FF(
 | 
			
		||||
   output Q,
 | 
			
		||||
   output reg Q,
 | 
			
		||||
   input D,
 | 
			
		||||
   input CE,
 | 
			
		||||
   input CLK,
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +46,53 @@ module EFX_FF(
 | 
			
		|||
   parameter SR_VALUE = 0;
 | 
			
		||||
   parameter SR_SYNC_PRIORITY = 0;
 | 
			
		||||
   parameter D_POLARITY = 1;
 | 
			
		||||
 | 
			
		||||
   wire clk;
 | 
			
		||||
   wire ce;
 | 
			
		||||
   wire sr;
 | 
			
		||||
   wire d;
 | 
			
		||||
   wire prio;
 | 
			
		||||
   wire sync;
 | 
			
		||||
   wire async;
 | 
			
		||||
 | 
			
		||||
   assign clk = CLK_POLARITY ? CLK : ~CLK;
 | 
			
		||||
   assign ce = CE_POLARITY ? CE : ~CE;
 | 
			
		||||
   assign sr = SR_POLARITY ? SR : ~SR;
 | 
			
		||||
   assign d = D_POLARITY ? D : ~D;
 | 
			
		||||
  
 | 
			
		||||
   generate
 | 
			
		||||
   	if (SR_SYNC == 1) 
 | 
			
		||||
      begin
 | 
			
		||||
         if (SR_SYNC_PRIORITY == 1) 
 | 
			
		||||
         begin
 | 
			
		||||
            always @(posedge clk)
 | 
			
		||||
               if (sr)
 | 
			
		||||
                  Q <= SR_VALUE;
 | 
			
		||||
               else if (ce)
 | 
			
		||||
                  Q <= d;
 | 
			
		||||
         end
 | 
			
		||||
         else
 | 
			
		||||
         begin
 | 
			
		||||
            always @(posedge clk)
 | 
			
		||||
               if (ce)
 | 
			
		||||
               begin
 | 
			
		||||
                  if (sr)
 | 
			
		||||
                     Q <= SR_VALUE;
 | 
			
		||||
                  else
 | 
			
		||||
                     Q <= d;
 | 
			
		||||
               end
 | 
			
		||||
         end
 | 
			
		||||
      end
 | 
			
		||||
      else
 | 
			
		||||
      begin
 | 
			
		||||
         always @(posedge clk or posedge sr)
 | 
			
		||||
            if (sr)
 | 
			
		||||
               Q <= SR_VALUE;
 | 
			
		||||
            else if (ce)
 | 
			
		||||
               Q <= d;
 | 
			
		||||
         
 | 
			
		||||
      end
 | 
			
		||||
   endgenerate
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module EFX_GBUFCE(
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +101,12 @@ module EFX_GBUFCE(
 | 
			
		|||
   output O
 | 
			
		||||
);
 | 
			
		||||
   parameter CE_POLARITY = 1'b1;
 | 
			
		||||
 | 
			
		||||
   wire ce;
 | 
			
		||||
   assign ce = CE_POLARITY ? CE : ~CE;
 | 
			
		||||
   
 | 
			
		||||
   assign O = I & ce;
 | 
			
		||||
   
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module EFX_RAM_5K(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue