YosysHQ / yosys

Yosys Open SYnthesis Suite
https://yosyshq.net/yosys/
ISC License
3.3k stars 860 forks source link

fix(#4402):missing sign while for loop iteration variable is signed #4416

Open YoYo-0513 opened 1 month ago

YoYo-0513 commented 1 month ago

Reseaon issue #4402

RCA: Like the code blow, iteration variable forvar14 is signed. However, the iteration variable lost the signed information during the ast simplify. For example, the value of forvar14 should be $signed(3'h0) instead of 3'h0 in the first loop cycle.

reg signed [2:0] forvar14 = (1'h0);
for (forvar14 = (1'h0); (forvar14 < (1'h1)); forvar14 = (forvar14 + (1'h1)))  begin
      .......
end

Fixes:

  1. backends/verilog/verilog_backend.cc Signed should be writed while dump verilog;

  2. frontends/ast/genrtlil.cc Before this change, children[0] will use the children[1]'s width_hint and sign_hint when genRTLIL, because they use the same variables and children[1]'s will overide children[0]'s.

  3. frontends/ast/simplify.cc Record iteration variable is signed or not;

Test A case was provided in #4402 , use PR branch to build a new yosys, read the 'rtl.v' and dump the verilog after synthesis. Then follow the reproduce steps in issue #4402 , result will meet expectations.