mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			47 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
/*
 | 
						|
Example from: https://www.latticesemi.com/-/media/LatticeSemi/Documents/UserManuals/EI/iCEcube201701UserGuide.ashx?document_id=52071 [p. 77].
 | 
						|
*/
 | 
						|
module top(clk,a,b,c,set);
 | 
						|
parameter A_WIDTH = 6 /*4*/;
 | 
						|
parameter B_WIDTH = 6 /*3*/;
 | 
						|
input set;
 | 
						|
input clk;
 | 
						|
input signed [(A_WIDTH - 1):0] a;
 | 
						|
input signed [(B_WIDTH - 1):0] b;
 | 
						|
output signed [(A_WIDTH + B_WIDTH - 1):0] c;
 | 
						|
reg [(A_WIDTH + B_WIDTH - 1):0] reg_tmp_c;
 | 
						|
assign c = reg_tmp_c;
 | 
						|
always @(posedge clk)
 | 
						|
begin
 | 
						|
    if(set)
 | 
						|
    begin
 | 
						|
        reg_tmp_c <= 0;
 | 
						|
    end
 | 
						|
    else
 | 
						|
    begin
 | 
						|
        reg_tmp_c <= a * b + c;
 | 
						|
    end
 | 
						|
end
 | 
						|
endmodule
 | 
						|
 | 
						|
module top2(clk,a,b,c,hold);
 | 
						|
parameter A_WIDTH = 6 /*4*/;
 | 
						|
parameter B_WIDTH = 6 /*3*/;
 | 
						|
input hold;
 | 
						|
input clk;
 | 
						|
input signed [(A_WIDTH - 1):0] a;
 | 
						|
input signed [(B_WIDTH - 1):0] b;
 | 
						|
output signed [(A_WIDTH + B_WIDTH - 1):0] c;
 | 
						|
reg signed [A_WIDTH-1:0] reg_a;
 | 
						|
reg signed [B_WIDTH-1:0] reg_b;
 | 
						|
reg [(A_WIDTH + B_WIDTH - 1):0] reg_tmp_c;
 | 
						|
assign c = reg_tmp_c;
 | 
						|
always @(posedge clk)
 | 
						|
begin
 | 
						|
    if (!hold) begin
 | 
						|
        reg_a <= a;
 | 
						|
        reg_b <= b;
 | 
						|
        reg_tmp_c <= reg_a * reg_b + c;
 | 
						|
    end
 | 
						|
end
 | 
						|
endmodule
 |