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 3184b33
Showing 1 changed file with 31 additions and 22 deletions.
53 changes: 31 additions & 22 deletions techlibs/common/simlib.v
Original file line number Diff line number Diff line change
Expand Up @@ -1234,22 +1234,22 @@ parameter C_SIGNED = 1'bx;

function integer sum_widths1;
input [(16*NPRODUCTS)-1:0] widths;
int i;
sum_widths1 = 0;
integer i;
begin
sum_widths1 = 0;
for (i = 0; i < NPRODUCTS; i++) begin
sum_widths1 += widths[16*i+:16];
sum_widths1 = sum_widths1 + widths[16*i+:16];
end
end
endfunction

function integer sum_widths2;
input [(16*NADDENDS)-1:0] widths;
int i;
sum_widths2 = 0;
integer i;
begin
sum_widths2 = 0;
for (i = 0; i < NADDENDS; i++) begin
sum_widths2 += widths[16*i+:16];
sum_widths2 = sum_widths2 + widths[16*i+:16];
end
end
endfunction
Expand All @@ -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,39 +1272,50 @@ 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 = oper_a * oper_b;

if (PRODUCT_NEGATED[i])
Y = Y - product;
else
Y = Y + product;

ai += aw;
bi += bw;
ai = ai + aw;
bi = bi + bw;
end

ci = 0;
for (i = 0; i < NADDENDS; i = i+1)
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;
else
Y = Y + addend;

ci += cw;
ci = ci + cw;
end
end

Expand Down

0 comments on commit 3184b33

Please sign in to comment.