summaryrefslogtreecommitdiff
path: root/tb/dsp_mul.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-11-06 12:22:37 -0600
committerAlejandro Soto <alejandro@34project.org>2022-11-06 12:34:25 -0600
commit044d2d73f0fbe6e1e42934f01b0f339776881b55 (patch)
tree358703da80e67f09e8d7824b35af13accaaa676f /tb/dsp_mul.sv
parentff5f2a94c06ce3af9cc04033220dcd0f6c8826e3 (diff)
Add multiplier unit
Diffstat (limited to 'tb/dsp_mul.sv')
-rw-r--r--tb/dsp_mul.sv45
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