Skip to content

Commit b641d24

Browse files
committed
Fix Icarus Verilog compat: use always_comb for unpacked array init
Icarus treats unpacked array elements as reg types and rejects continuous assignment to them. Replace assign statements driving index [0] of pipeline arrays with always_comb blocks in fp_divider and fp_sqrt.
1 parent d9fc6da commit b641d24

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

hw/rtl/cpu_and_mem/cpu/ex_stage/fpu/fp_divider.sv

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -410,17 +410,19 @@ module fp_divider #(
410410
logic div_special_div_zero[DivCycles+1];
411411
logic [ 2:0] div_rm [DivCycles+1];
412412

413-
// Connect stage 3 output to divide pipeline input
414-
assign div_quotient[0] = s3_quotient;
415-
assign div_remainder[0] = s3_remainder;
416-
assign div_divisor[0] = s3_divisor;
417-
assign div_result_exp[0] = s3_result_exp;
418-
assign div_result_sign[0] = s3_result_sign;
419-
assign div_is_special[0] = s3_is_special;
420-
assign div_special_result[0] = s3_special_result;
421-
assign div_special_invalid[0] = s3_special_invalid;
422-
assign div_special_div_zero[0] = s3_special_div_zero;
423-
assign div_rm[0] = s3_rm;
413+
// Connect stage 3 output to divide pipeline input (always_comb for Icarus compat)
414+
always_comb begin
415+
div_quotient[0] = s3_quotient;
416+
div_remainder[0] = s3_remainder;
417+
div_divisor[0] = s3_divisor;
418+
div_result_exp[0] = s3_result_exp;
419+
div_result_sign[0] = s3_result_sign;
420+
div_is_special[0] = s3_is_special;
421+
div_special_result[0] = s3_special_result;
422+
div_special_invalid[0] = s3_special_invalid;
423+
div_special_div_zero[0] = s3_special_div_zero;
424+
div_rm[0] = s3_rm;
425+
end
424426

425427
// Generate block: one radix-2 division step per stage
426428
for (genvar g = 0; g < DivCycles; g++) begin : gen_div

hw/rtl/cpu_and_mem/cpu/ex_stage/fpu/fp_sqrt.sv

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -287,15 +287,17 @@ module fp_sqrt #(
287287
logic comp_special_invalid[RootBits+1];
288288
logic [ 2:0] comp_rm [RootBits+1];
289289

290-
// Connect stage 2 output to compute pipeline input
291-
assign comp_root[0] = s2_root;
292-
assign comp_remainder[0] = s2_remainder;
293-
assign comp_radicand[0] = s2_radicand;
294-
assign comp_result_exp[0] = s2_result_exp;
295-
assign comp_is_special[0] = s2_is_special;
296-
assign comp_special_result[0] = s2_special_result;
297-
assign comp_special_invalid[0] = s2_special_invalid;
298-
assign comp_rm[0] = s2_rm;
290+
// Connect stage 2 output to compute pipeline input (always_comb for Icarus compat)
291+
always_comb begin
292+
comp_root[0] = s2_root;
293+
comp_remainder[0] = s2_remainder;
294+
comp_radicand[0] = s2_radicand;
295+
comp_result_exp[0] = s2_result_exp;
296+
comp_is_special[0] = s2_is_special;
297+
comp_special_result[0] = s2_special_result;
298+
comp_special_invalid[0] = s2_special_invalid;
299+
comp_rm[0] = s2_rm;
300+
end
299301

300302
// Generate block: one digit-recurrence step per stage
301303
for (genvar g = 0; g < RootBits; g++) begin : gen_sqrt

0 commit comments

Comments
 (0)