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