diff options
| author | Alejandro Soto <alejandro@34project.org> | 2022-11-06 12:22:37 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2022-11-06 12:34:25 -0600 |
| commit | 044d2d73f0fbe6e1e42934f01b0f339776881b55 (patch) | |
| tree | 358703da80e67f09e8d7824b35af13accaaa676f /tb/dsp_mul.sv | |
| parent | ff5f2a94c06ce3af9cc04033220dcd0f6c8826e3 (diff) | |
Add multiplier unit
Diffstat (limited to 'tb/dsp_mul.sv')
| -rw-r--r-- | tb/dsp_mul.sv | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/tb/dsp_mul.sv b/tb/dsp_mul.sv new file mode 100644 index 0000000..d6fcb6a --- /dev/null +++ b/tb/dsp_mul.sv @@ -0,0 +1,45 @@ +module dsp_mul +( + output logic [63:0] result, // result.result + input logic [31:0] dataa_0, // dataa_0.dataa_0 + input logic [31:0] datab_0, // datab_0.datab_0 + input logic signa, // signa.signa + input logic signb, // signb.signb + input logic clock0, // clock0.clock0 + input logic ena0, // ena0.ena0 + input logic aclr0, // aclr0.aclr0 + input logic [63:0] chainin // chainin.chainin +); + + logic[31:0] hold_a, hold_b; + logic[63:0] hold_chainin, ext_a, ext_b, product; + logic hold_signa, hold_signb; + + assign ext_a = {{32{hold_signa && hold_a[31]}}, hold_a}; + assign ext_b = {{32{hold_signb && hold_b[31]}}, hold_b}; + + always_comb + unique case({hold_signa, hold_signb}) + 2'b00: product = ext_a * ext_b; + 2'b01: product = ext_a * $signed(ext_b); + 2'b10: product = $signed(ext_a) * ext_b; + 2'b11: product = $signed(ext_a) * $signed(ext_b); + endcase + + always @(posedge clock0 or negedge aclr0) + if(!aclr0) begin + result <= {64{1'bx}}; + hold_a <= {32{1'bx}}; + hold_b <= {32{1'bx}}; + hold_signa <= 1'bx; + hold_signb <= 1'bx; + end else if(ena0) begin + hold_a <= dataa_0; + hold_b <= datab_0; + hold_chainin <= chainin; + hold_signa <= signa; + hold_signb <= signb; + result <= hold_chainin + product; + end + +endmodule |
