Skip to content

Commit

Permalink
macc_v2: Fix language constructs in simlib model
Browse files Browse the repository at this point in the history
  • Loading branch information
povik committed Jan 24, 2025
1 parent cb8f855 commit f3a64ab
Showing 1 changed file with 22 additions and 13 deletions.
35 changes: 22 additions & 13 deletions techlibs/common/simlib.v
Original file line number Diff line number Diff line change
Expand Up @@ -1261,9 +1261,7 @@ output reg [Y_WIDTH-1:0] Y; // output sum

integer i, j, ai, bi, ci, aw, bw, cw;
reg [Y_WIDTH-1:0] product;
reg signed [Y_WIDTH-1:0] product_signed;
reg [Y_WIDTH-1:0] addend;
reg signed [Y_WIDTH-1:0] addend_signed;
reg [Y_WIDTH-1:0] addend, oper_a, oper_b;

always @* begin
Y = 0;
Expand All @@ -1274,12 +1272,21 @@ always @* begin
aw = A_WIDTHS[16*i+:16];
bw = B_WIDTHS[16*i+:16];

product = A[ai +: aw] * B[bi +: bw];
product_signed = $signed(A[ai +: aw]) * $signed(B[bi +: bw]);

oper_a = 0;
oper_b = 0;
for (j = 0; j < Y_WIDTH && j < aw; j = j + 1)
oper_a[j] = A[ai + j];
for (j = 0; j < Y_WIDTH && j < bw; j = j + 1)
oper_b[j] = B[bi + j];
// A_SIGNED[i] == B_SIGNED[i] as RTLIL invariant
if (A_SIGNED[i] && B_SIGNED[i])
product = product_signed;
if (A_SIGNED[i] && B_SIGNED[i]) begin
for (j = aw; j > 0 && j < Y_WIDTH; j = j + 1)
oper_a[j] = oper_a[j - 1];
for (j = bw; j > 0 && j < Y_WIDTH; j = j + 1)
oper_b[j] = oper_b[j - 1];
end

product = A[ai +: aw] * B[bi +: bw];

if (PRODUCT_NEGATED[i])
Y = Y - product;
Expand All @@ -1295,11 +1302,13 @@ always @* begin
begin
cw = C_WIDTHS[16*i+:16];

addend = C[ci +: cw];
addend_signed = $signed(C[ci +: cw]);

if (C_SIGNED[i])
addend = addend_signed;
addend = 0;
for (j = 0; j < Y_WIDTH && j < cw; j = j + 1)
addend[j] = C[ci + j];
if (C_SIGNED[i]) begin
for (j = cw; j > 0 && j < Y_WIDTH; j = j + 1)
addend[j] = addend[j - 1];
end

if (ADDEND_NEGATED[i])
Y = Y - addend;
Expand Down

0 comments on commit f3a64ab

Please sign in to comment.