/* 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