mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 19:22:31 +00:00 
			
		
		
		
	Fixed broken Quartus backend on dffeas init value (Error (12170): Illegal value for the POWER_UP parameter. Fixed and tested Cyclone V device
This commit is contained in:
		
							parent
							
								
									93985d91b1
								
							
						
					
					
						commit
						efed2420d6
					
				
					 11 changed files with 232 additions and 177 deletions
				
			
		|  | @ -16,53 +16,25 @@ | |||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| // Normal mode DFF negedge clk, negedge reset | ||||
| module  \$_DFF_N_ (input D, C, output Q); | ||||
|    parameter WYSIWYG="TRUE"; | ||||
|    dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(1'b1), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0)); | ||||
| endmodule | ||||
| // Normal mode DFF | ||||
| module  \$_DFF_P_ (input D, C, output Q); | ||||
|    parameter WYSIWYG="TRUE"; | ||||
|    dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(1'b1), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0)); | ||||
| endmodule | ||||
| 
 | ||||
| // Async Active Low Reset DFF | ||||
| module  \$_DFF_PN0_ (input D, C, R, output Q); | ||||
|    parameter WYSIWYG="TRUE"; | ||||
|    dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0)); | ||||
| endmodule | ||||
| // Async Active High Reset DFF | ||||
| module  \$_DFF_PP0_ (input D, C, R, output Q); | ||||
|    parameter WYSIWYG="TRUE"; | ||||
|    wire R_i = ~ R; | ||||
|    dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0)); | ||||
| endmodule | ||||
| // Async Active Low Reset DFF | ||||
| module  \$_DFF_PN0_ (input D, C, R, output Q); | ||||
|    parameter WYSIWYG="TRUE"; | ||||
|    dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0)); | ||||
| endmodule | ||||
| /* */ | ||||
| module  \$__DFFE_PP0 (input D, C, E, R, output Q); | ||||
|    parameter WYSIWYG="TRUE"; | ||||
|    wire E_i = ~ E; | ||||
|    dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(E_i), .sload(1'b0)); | ||||
| endmodule | ||||
| // > c60k28 (Viacheslav, VT) [at] yandex [dot] com | ||||
| // > Achronix eFPGA technology mapping. User must first simulate the generated \ | ||||
| // > netlist before going to test it on board/custom chip. | ||||
| 
 | ||||
| // > Input/Output buffers < | ||||
| // Input buffer map | ||||
| module \$__inpad (input I, output O); | ||||
|     PADIN _TECHMAP_REPLACE_ (.padout(O), .padin(I)); | ||||
| endmodule | ||||
| 
 | ||||
| // Output buffer map | ||||
| module \$__outpad (input I, output O); | ||||
|     PADOUT _TECHMAP_REPLACE_ (.padout(O), .padin(I), .oe(1'b1)); | ||||
| endmodule | ||||
| // > end buffers < | ||||
| 
 | ||||
| // > Look-Up table < | ||||
| // > VT: I still think Achronix folks would have choosen a better \ | ||||
| // >     logic architecture. | ||||
| // LUT Map | ||||
| /* 0 -> datac | ||||
|    1 -> cin */ | ||||
| module \$lut (A, Y); | ||||
|    parameter WIDTH  = 0; | ||||
|    parameter LUT    = 0; | ||||
|  | @ -70,19 +42,31 @@ module \$lut (A, Y); | |||
|    output 	     Y; | ||||
|    generate | ||||
|       if (WIDTH == 1) begin | ||||
| 	   assign Y = ~A[0]; // Not need to spend 1 logic cell for such an easy function | ||||
| 	   // VT: This is not consistent and ACE will complain: assign Y = ~A[0]; | ||||
|          LUT4 #(.lut_function({4{LUT}})) _TECHMAP_REPLACE_  | ||||
|            (.dout(Y), .din0(A[0]), .din1(1'b0), .din2(1'b0), .din3(1'b0)); | ||||
|       end else | ||||
|       if (WIDTH == 2) begin | ||||
|               LUT4 #(.lut_function({4{LUT}})) _TECHMAP_REPLACE_ (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(1'b0),.din3(1'b0)); | ||||
|               LUT4 #(.lut_function({4{LUT}})) _TECHMAP_REPLACE_  | ||||
|                 (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(1'b0), .din3(1'b0)); | ||||
|       end else | ||||
|       if(WIDTH == 3) begin | ||||
| 	      LUT4 #(.lut_function({2{LUT}})) _TECHMAP_REPLACE_ (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(A[2]),.din3(1'b0)); | ||||
| 	      LUT4 #(.lut_function({2{LUT}})) _TECHMAP_REPLACE_  | ||||
|                 (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(A[2]), .din3(1'b0)); | ||||
|       end else | ||||
|       if(WIDTH == 4) begin | ||||
|              LUT4 #(.lut_function(LUT)) _TECHMAP_REPLACE_ (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(A[2]), .din3(A[3])); | ||||
|              LUT4 #(.lut_function(LUT)) _TECHMAP_REPLACE_  | ||||
|                (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(A[2]), .din3(A[3])); | ||||
|       end else | ||||
| 	   wire _TECHMAP_FAIL_ = 1; | ||||
|    endgenerate | ||||
| endmodule // | ||||
| endmodule  | ||||
| // > end LUT < | ||||
| 
 | ||||
| // > Flops < | ||||
| // DFF flop | ||||
| module  \$_DFF_P_ (input D, C, output Q); | ||||
|    DFF _TECHMAP_REPLACE_  | ||||
|      (.q(Q), .d(D), .ck(C)); | ||||
| endmodule  | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,50 +16,31 @@ | |||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| // > c60k28 (Viacheslav, VT) [at] yandex [dot] com | ||||
| // > Achronix eFPGA technology sim models. User must first simulate the generated \ | ||||
| // > netlist before going to test it on board/custom chip. | ||||
| // > Changelog: 1) Removed unused VCC/GND modules | ||||
| // >            2) Altera comments here (?). Removed. | ||||
| // >            3) Reusing LUT sim model, removed wrong wires and parameters. | ||||
| 
 | ||||
| module VCC (output V); | ||||
|    assign V = 1'b1; | ||||
| endmodule // VCC | ||||
| 
 | ||||
| module GND (output G); | ||||
|    assign G = 1'b0; | ||||
| endmodule // GND | ||||
| 
 | ||||
| /* Altera MAX10 devices Input Buffer Primitive */ | ||||
| module PADIN (output padout, input padin); | ||||
|    assign padout = padin; | ||||
| endmodule // fiftyfivenm_io_ibuf | ||||
| endmodule | ||||
| 
 | ||||
| /* Altera MAX10 devices Output Buffer Primitive */ | ||||
| module PADOUT (output padout, input padin, input oe); | ||||
|    assign padout  = padin; | ||||
|    assign oe = oe; | ||||
| endmodule // fiftyfivenm_io_obuf | ||||
| endmodule  | ||||
| 
 | ||||
| /* Altera MAX10 4-input non-fracturable LUT Primitive */ | ||||
| module LUT4 (output dout, | ||||
|              input  din0, din1, din2, din3); | ||||
| 
 | ||||
| /* Internal parameters which define the behaviour | ||||
|    of the LUT primitive. | ||||
|    lut_mask define the lut function, can be expressed in 16-digit bin or hex. | ||||
|    sum_lutc_input define the type of LUT (combinational | arithmetic). | ||||
|    dont_touch for retiming || carry options. | ||||
|    lpm_type for WYSIWYG */ | ||||
| 
 | ||||
| parameter lut_function = 16'hFFFF; | ||||
| //parameter dont_touch = "off"; | ||||
| //parameter lpm_type = "fiftyfivenm_lcell_comb"; | ||||
| //parameter sum_lutc_input = "datac"; | ||||
| 
 | ||||
| reg [1:0] lut_type; | ||||
| reg cout_rt; | ||||
| parameter [15:0] lut_function = 16'hFFFF; | ||||
| reg combout_rt; | ||||
| wire dataa_w; | ||||
| wire datab_w; | ||||
| wire datac_w; | ||||
| wire datad_w; | ||||
| wire cin_w; | ||||
| 
 | ||||
| assign dataa_w = din0; | ||||
| assign datab_w = din1; | ||||
|  | @ -78,49 +59,21 @@ reg [1:0]   s1; | |||
|        s1 = datab ?   s2[3:2]  :   s2[1:0]; | ||||
|        lut_data = dataa ? s1[1] : s1[0]; | ||||
|   end | ||||
| 
 | ||||
| endfunction | ||||
| 
 | ||||
| initial begin | ||||
|     /*if (sum_lutc_input == "datac")*/ lut_type = 0; | ||||
|     /*else | ||||
|     if (sum_lutc_input == "cin")   lut_type = 1; | ||||
|     else begin | ||||
|       $error("Error in sum_lutc_input. Parameter %s is not a valid value.\n", sum_lutc_input); | ||||
|       $finish(); | ||||
|     end*/ | ||||
| end | ||||
| 
 | ||||
| always @(dataa_w or datab_w or datac_w or datad_w or cin_w) begin | ||||
|     if (lut_type == 0) begin // logic function | ||||
|         combout_rt = lut_data(lut_function, dataa_w, datab_w, | ||||
|                             datac_w, datad_w); | ||||
|     end | ||||
|     else if (lut_type == 1) begin // arithmetic function | ||||
|         combout_rt = lut_data(lut_function, dataa_w, datab_w, | ||||
|                             cin_w, datad_w); | ||||
|     end | ||||
|     cout_rt = lut_data(lut_function, dataa_w, datab_w, cin_w, 'b0); | ||||
|    combout_rt = lut_data(lut_function, dataa_w, datab_w, | ||||
|                          datac_w, datad_w); | ||||
| end | ||||
| 
 | ||||
| assign dout = combout_rt & 1'b1; | ||||
| //assign cout = cout_rt & 1'b1; | ||||
| 
 | ||||
| endmodule // fiftyfivenm_lcell_comb | ||||
| 
 | ||||
| /* Altera MAX10 D Flip-Flop Primitive */ | ||||
| // TODO: Implement advanced simulation functions | ||||
| module dffeas ( output q, | ||||
|                 input d, clk, clrn, prn, ena, | ||||
| 		input asdata, aload, sclr, sload ); | ||||
| 
 | ||||
| parameter power_up="dontcare"; | ||||
| parameter is_wysiwyg="false"; | ||||
|   reg q; | ||||
| 
 | ||||
|   always @(posedge clk) | ||||
|     q <= d; | ||||
| endmodule  | ||||
| 
 | ||||
| module DFF (output q, | ||||
|             input  d, ck); | ||||
|    reg             q; | ||||
|    always @(posedge ck) | ||||
|      q <= d; | ||||
|     | ||||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue