verilator / verilator

Verilator open-source SystemVerilog simulator and lint system
https://verilator.org
GNU Lesser General Public License v3.0
2.5k stars 599 forks source link

Paid development: support for fx68k #3500

Closed jotego closed 2 years ago

jotego commented 2 years ago

The open source M68000 module FX68K does not work on Verilator. The problem seems to be the packed/unpacked structures (plus a couple of combinational optimization loops). The module author does not want to modify it to remove the structures. Commercial simulators and synthesis tools work correctly with his code. The open source simulators Verilator and Icarus verilog don't.

How much would it cost to pay a Verilator developer to add support to this module?

Thank you

wsnyder commented 2 years ago

Thanks for suggesting this be handled commercially; please contact the folks here https://www.veripool.org/verilator_commercial_support/ if they haven't contacted you already.

Note that usually the conversion to packed arrays is sufficient, are you getting an error message?

Also the ordering warnings can be turned off and generally a design will work (and is likely fixed in v5-devel).

udif commented 2 years ago

By pure coincidence I took a look today at https://chipsalliance.github.io/sv-tests-results/?v=verilator+fx68k+fx68k and couldn't help noticing that fx68k is reported to be building fine under Verilator, with only warnings. Since I remembered this issue, I couldn't help peeking into the report.

Looking into the warnings, I see this:

%Warning-UNPACKED: [third_party/cores/fx68k/fx68k.sv:48:9](https://chipsalliance.github.io/sv-tests-results/third_party/cores/fx68k/fx68k.sv.html#l-48): Unsupported: Unpacked struct/union
                                                                                : ... In instance fx68k
%Warning-UNPACKED: [third_party/cores/fx68k/fx68k.sv:73:9](https://chipsalliance.github.io/sv-tests-results/third_party/cores/fx68k/fx68k.sv.html#l-73): Unsupported: Unpacked struct/union
                                                                                : ... In instance fx68k
%Warning-UNPACKED: [third_party/cores/fx68k/fx68k.sv:56:9](https://chipsalliance.github.io/sv-tests-results/third_party/cores/fx68k/fx68k.sv.html#l-56): Unsupported: Unpacked struct/union
                                                                                : ... In instance fx68k

If this is unsupported, and the simulation will not run, why is this reported as a Warning and not an Error?

Besides, after reading IEEE1800-2017, I came to the conclusion that the only difference between packed and unpacked structs are:

  1. You can treat packed structs as a superset of unpacked structs (i.e. there are several things you can do with a packed struct but not with an unpacked struct)
  2. The only thing unpacked structs are providing over packed structs is that they can contain any other types.

So:

I took a look at the the other warnings out of curiosity, and noticed a few things:

  1. fx68k is using // synopsys translate on and // synopsys translate off which should really be avoided, and replaced with something along the lines of `ifdef SYNTHESIS ... `endif
  2. Verilator is not supporting // synopsys translate on on purpose. See https://github.com/verilator/verilator/issues/24
  3. You can check my branch, https://github.com/udif/verilator/tree/synthesis_off , which I maintain for work-related issues, but please be aware that I merge it with the master branch only so-often, and if I were in your position, I would fix the code instead.

Given these 2 minor fx68k <> Verilator incompatibilities, I would simply fork a branch of fx68k and fix it if for my needs:

jotego commented 2 years ago

Thank you for looking into this.

Verilator does not support mixed blocked and non-blocking assignemnts to a variable. This becomes a problem for the struct types because each signal within the struct is given a different treatment by the code, thus it is unpacked. There seem to be like 33 such errors. See the report below. I have no idea how they got the report you linked to.

I did try to remove the structs and use plain signals in my fx68k branch, but although a formal tool seemed to be happy with the changes, Verilator still didn't simulate the result correctly so I guess my code wasn't really equivalent.

The author of fx68k is highly reluctant to making any changes to the code, particularly for something he argus is a simulator tool problem. My take at this is that it's better to design open source modules to work with FOSS tools, but well, open source comes with no warranties, so what can you do about it.


%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:468:40: Operator COND expects 9 bits on the Conditional True, but Conditional True's CONST '4'h6' generates 4 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu.aluCorf
  468 |    htemp = { 1'b0, binResult} + (lowC  ? 4'h6 : 4'h0);
      |                                        ^
                ... For warning description see https://verilator.org/warn/WIDTH?v=4.224
                ... Use "/* verilator lint_off WIDTH */" and lint_on around source to disable this message.
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:468:40: Operator COND expects 9 bits on the Conditional False, but Conditional False's CONST '4'h0' generates 4 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu.aluCorf
  468 |    htemp = { 1'b0, binResult} + (lowC  ? 4'h6 : 4'h0);
      |                                        ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:469:32: Operator COND expects 5 bits on the Conditional True, but Conditional True's CONST '4'h6' generates 4 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu.aluCorf
  469 |    hNib  = htemp[8:4] + (highC ? 4'h6 : 4'h0);
      |                                ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:469:32: Operator COND expects 5 bits on the Conditional False, but Conditional False's CONST '4'h0' generates 4 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu.aluCorf
  469 |    hNib  = htemp[8:4] + (highC ? 4'h6 : 4'h0);
      |                                ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:473:40: Operator COND expects 9 bits on the Conditional True, but Conditional True's CONST '4'h6' generates 4 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu.aluCorf
  473 |    htemp = { 1'b0, binResult} - (lowC  ? 4'h6 : 4'h0);
      |                                        ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:473:40: Operator COND expects 9 bits on the Conditional False, but Conditional False's CONST '4'h0' generates 4 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu.aluCorf
  473 |    htemp = { 1'b0, binResult} - (lowC  ? 4'h6 : 4'h0);
      |                                        ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:474:32: Operator COND expects 5 bits on the Conditional True, but Conditional True's CONST '4'h6' generates 4 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu.aluCorf
  474 |    hNib  = htemp[8:4] - (highC ? 4'h6 : 4'h0);
      |                                ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:474:32: Operator COND expects 5 bits on the Conditional False, but Conditional False's CONST '4'h0' generates 4 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu.aluCorf
  474 |    hNib  = htemp[8:4] - (highC ? 4'h6 : 4'h0);
      |                                ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:1930:19: Operator ASSIGN expects 4 bits on the Assign RHS, but Assign RHS's VARREF 'i' generates 32 bits.
                                                          : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.rmPren
 1930 |              hbit = i;
      |                   ^
%Warning-UNPACKED: ../../../../modules/fx68k/fx68k.sv:48:9: Unsupported: Unpacked struct/union
                                                          : ... In instance game_test.u_game
   48 | typedef struct {
      |         ^~~~~~
%Warning-UNPACKED: ../../../../modules/fx68k/fx68k.sv:73:9: Unsupported: Unpacked struct/union
                                                          : ... In instance game_test.u_game
   73 | typedef struct {
      |         ^~~~~~
%Warning-UNPACKED: ../../../../modules/fx68k/fx68k.sv:56:9: Unsupported: Unpacked struct/union
                                                          : ... In instance game_test.u_game
   56 | typedef struct {
      |         ^~~~~~
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:278:39: Operator ADD expects 17 bits on the LHS, but LHS's REPLICATE generates 9 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu
  278 |     rtemp = bAdd ? { 1'b0, inpb[7:0]} + { 1'b0, inpa[7:0]} + cin:
      |                                       ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:278:39: Operator ADD expects 17 bits on the RHS, but RHS's REPLICATE generates 9 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu
  278 |     rtemp = bAdd ? { 1'b0, inpb[7:0]} + { 1'b0, inpa[7:0]} + cin:
      |                                       ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:278:60: Operator ADD expects 17 bits on the RHS, but RHS's VARREF 'cin' generates 1 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu
  278 |     rtemp = bAdd ? { 1'b0, inpb[7:0]} + { 1'b0, inpa[7:0]} + cin:
      |                                                            ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:279:29: Operator SUB expects 17 bits on the LHS, but LHS's REPLICATE generates 9 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu
  279 |         { 1'b0, inpb[7:0] } - { 1'b0, inpa[7:0]} - cin;
      |                             ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:279:29: Operator SUB expects 17 bits on the RHS, but RHS's REPLICATE generates 9 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu
  279 |         { 1'b0, inpb[7:0] } - { 1'b0, inpa[7:0]} - cin;
      |                             ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:279:50: Operator SUB expects 17 bits on the RHS, but RHS's VARREF 'cin' generates 1 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu
  279 |         { 1'b0, inpb[7:0] } - { 1'b0, inpa[7:0]} - cin;
      |                                                  ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:284:51: Operator ADD expects 17 bits on the RHS, but RHS's VARREF 'cin' generates 1 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu
  284 |     rtemp = bAdd ? { 1'b0, inpb } + { 1'b0, inpa} + cin:
      |                                                   ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68kAlu.sv:285:40: Operator SUB expects 17 bits on the RHS, but RHS's VARREF 'cin' generates 1 bits.
                                                            : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit.alu
  285 |         { 1'b0, inpb } - { 1'b0, inpa} - cin;
      |                                        ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:2397:25: Operator AND expects 32 bits on the LHS, but LHS's SEL generates 1 bits.
                                                          : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.busControl
 2397 |    else if( Clks.enPhi2 & bcComplete & ~SRMC_RES)
      |                         ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:2397:25: Operator AND expects 32 bits on the RHS, but RHS's VARREF 'bcComplete' generates 1 bits.
                                                          : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.busControl
 2397 |    else if( Clks.enPhi2 & bcComplete & ~SRMC_RES)
      |                         ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:2397:9: Logical operator IF expects 1 bit on the If, but If's AND generates 32 bits.
                                                         : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.busControl
 2397 |    else if( Clks.enPhi2 & bcComplete & ~SRMC_RES)
      |         ^~
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:2142:8: Operator ASSIGN expects 4 bits on the Assign RHS, but Assign RHS's REPLICATE generates 2 bits.
                                                         : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.sequencer
 2142 |    tvn = { 1'b1, rExcAdrErr};
      |        ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:1841:22: Operator ASSIGN expects 4 bits on the Assign RHS, but Assign RHS's SEL generates 3 bits.
                                                          : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.uaddrDecode
 1841 |  default:   eaDecode = eaBits[5:3];       
      |                      ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:1250:10: Operator ASSIGN expects 4 bits on the Assign RHS, but Assign RHS's CONST '1'bx' generates 1 bits.
                                                          : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit
 1250 |    rxReg = 1'bX;
      |          ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:1255:10: Operator ASSIGN expects 4 bits on the Assign RHS, but Assign RHS's CONST '1'bx' generates 1 bits.
                                                          : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit
 1255 |    rxReg = 1'bX;
      |          ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:1260:10: Operator ASSIGN expects 4 bits on the Assign RHS, but Assign RHS's CONST '1'bx' generates 1 bits.
                                                          : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit
 1260 |    rxReg = 1'bX;
      |          ^
%Warning-WIDTH: ../../../../modules/fx68k/fx68k.sv:1504:48: Operator ADD expects 16 bits on the RHS, but RHS's SEL generates 1 bits.
                                                          : ... In instance game_test.u_game.u_sub.u_cpu.u_cpu.excUnit
 1504 |  wire [31:0] auResult = {Dbh + auInpMux[31:16] + aulow[16], aulow[15:0]};
      |                                                ^
%Warning-UNDRIVEN: ../../hdl/jtoutrun_game.v:152:13: Signal is not driven: 'sndmap_din'
                                                   : ... In instance game_test.u_game
  152 | wire [ 7:0] sndmap_din, sndmap_dout;
      |             ^~~~~~~~~~
%Warning-UNDRIVEN: ../../../../modules/jtframe/hdl/sdram/jtframe_dwnld.v:42:26: Signal is not driven: 'prog_ba'
                                                                              : ... In instance game_test.u_game.u_sdram.u_dwnld
   42 |     output reg [ 1:0]    prog_ba,
      |                          ^~~~~~~
%Warning-CASEINCOMPLETE: ../../../../modules/jtframe/hdl/cpu/jtframe_68kdma.v:38:9: Case values incompletely covered (example pattern 0x3)
   38 |         casez( {cpu_BRn, cpu_BGn, cpu_BGACKn} )
      |         ^~~~~
%Warning-INITIALDLY: ../../../../modules/fx68k/fx68k.sv:1189:11: Non-blocking assignment '<=' in initial/final block
                                                               : ... In instance game_test.u_game.u_main.u_cpu
                                                               : ... This will be executed as a blocking assignment '='!
 1189 |    regs68L[i] <= '0;
      |           ^
%Warning-INITIALDLY: ../../../../modules/fx68k/fx68k.sv:1190:11: Non-blocking assignment '<=' in initial/final block
                                                               : ... In instance game_test.u_game.u_main.u_cpu
                                                               : ... This will be executed as a blocking assignment '='!
 1190 |    regs68H[i] <= '0;
      |           ^
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:743:4: ... Location of nonblocking assignment
  743 |    Nanod.auClkEn <= !nanoLatch[ NANO_AUCLKEN];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:744:4: ... Location of nonblocking assignment
  744 |    Nanod.auCntrl <= nanoLatch[ NANO_AUCTRL+2 : NANO_AUCTRL+0];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:746:4: ... Location of nonblocking assignment
  746 |    Nanod.extDbh <= nanoLatch[ NANO_EXT_DBH];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:748:4: ... Location of nonblocking assignment
  748 |    Nanod.todbin <= nanoLatch[ NANO_TODBIN];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:754:4: ... Location of nonblocking assignment
  754 |    Nanod.ablAbd <= nanoLatch[ NANO_ABLABD];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:757:4: ... Location of nonblocking assignment
  757 |    Nanod.dblDbh <= nanoLatch[ NANO_DBLDBH];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:759:4: ... Location of nonblocking assignment
  759 |    Nanod.dbl2Atl <= (atlCtrl == 3'b010);
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:760:4: ... Location of nonblocking assignment
  760 |    Nanod.atl2Dbl <= (atlCtrl == 3'b011);
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:764:4: ... Location of nonblocking assignment
  764 |    Nanod.aob2Ab <= (athCtrl == 3'b101);   
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:766:4: ... Location of nonblocking assignment
  766 |    Nanod.abh2Ath <= (athCtrl == 3'b001) | (athCtrl == 3'b101);
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:768:4: ... Location of nonblocking assignment
  768 |    Nanod.ath2Dbh <= (athCtrl == 3'b110);
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:771:4: ... Location of nonblocking assignment
  771 |    Nanod.alu2Dbd <= nanoLatch[ NANO_ALU2DBD];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:774:4: ... Location of nonblocking assignment
  774 |    Nanod.abd2Dcr <= (nanoLatch[ NANO_DCR+1:NANO_DCR] == 2'b11);
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:776:4: ... Location of nonblocking assignment
  776 |    Nanod.dbd2Alue <= (nanoLatch[ NANO_ALUE+2:NANO_ALUE+1] == 2'b10);
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:779:4: ... Location of nonblocking assignment
  779 |    Nanod.dbd2Alub <= nanoLatch[ NANO_DBD2ALUB];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:783:4: ... Location of nonblocking assignment
  783 |    Nanod.dobCtrl <= dobCtrl;
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:898:4: ... Location of nonblocking assignment
  898 |    Nanod.rxl2db <= Nanod.reg2dbl & !dblSpecial & nanoLatch[ NANO_RXL_DBL];
      |    ^~~~~
%Warning-MULTIDRIVEN: ../../../../modules/fx68k/fx68k.sv:293:10: Signal has multiple driving blocks with different clocking: 'u_cpu.Nanod'
                                                               : ... In instance game_test.u_game.u_sub.u_cpu
                      ../../../../modules/fx68k/fx68k.sv:898:4: ... Location of first driving block
  898 |    Nanod.rxl2db <= Nanod.reg2dbl & !dblSpecial & nanoLatch[ NANO_RXL_DBL];
      |    ^~~~~
                      ../../../../modules/fx68k/fx68k.sv:743:4: ... Location of other driving block
  743 |    Nanod.auClkEn <= !nanoLatch[ NANO_AUCLKEN];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:899:4: ... Location of nonblocking assignment
  899 |    Nanod.rxl2ab <= Nanod.reg2abl & !ablSpecial & !nanoLatch[ NANO_RXL_DBL];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:901:4: ... Location of nonblocking assignment
  901 |    Nanod.dbl2rxl <= Nanod.dbl2reg & !dblSpecial & nanoLatch[ NANO_RXL_DBL]; 
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:902:4: ... Location of nonblocking assignment
  902 |    Nanod.abl2rxl <= Nanod.abl2reg & !ablSpecial & !nanoLatch[ NANO_RXL_DBL]; 
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:904:4: ... Location of nonblocking assignment
  904 |    Nanod.rxh2dbh <= Nanod.reg2dbh & !dbhSpecial & nanoLatch[ NANO_RXH_DBH];   
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:905:4: ... Location of nonblocking assignment
  905 |    Nanod.rxh2abh <= Nanod.reg2abh & !abhSpecial & !nanoLatch[ NANO_RXH_DBH];   
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:907:4: ... Location of nonblocking assignment
  907 |    Nanod.dbh2rxh <= Nanod.dbh2reg & !dbhSpecial & nanoLatch[ NANO_RXH_DBH];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:908:4: ... Location of nonblocking assignment
  908 |    Nanod.abh2rxh <= Nanod.abh2reg & !abhSpecial & !nanoLatch[ NANO_RXH_DBH]; 
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:910:4: ... Location of nonblocking assignment
  910 |    Nanod.dbh2ryh <= Nanod.dbh2reg & !dbhSpecial & !nanoLatch[ NANO_RXH_DBH];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:911:4: ... Location of nonblocking assignment
  911 |    Nanod.abh2ryh <= Nanod.abh2reg & !abhSpecial & nanoLatch[ NANO_RXH_DBH]; 
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:913:4: ... Location of nonblocking assignment
  913 |    Nanod.dbl2ryl <= Nanod.dbl2reg & !dblSpecial & !nanoLatch[ NANO_RXL_DBL]; 
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:914:4: ... Location of nonblocking assignment
  914 |    Nanod.abl2ryl <= Nanod.abl2reg & !ablSpecial & nanoLatch[ NANO_RXL_DBL]; 
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:916:4: ... Location of nonblocking assignment
  916 |    Nanod.ryl2db <= Nanod.reg2dbl & !dblSpecial & !nanoLatch[ NANO_RXL_DBL];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:917:4: ... Location of nonblocking assignment
  917 |    Nanod.ryl2ab <= Nanod.reg2abl & !ablSpecial & nanoLatch[ NANO_RXL_DBL];
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:919:4: ... Location of nonblocking assignment
  919 |    Nanod.ryh2dbh <= Nanod.reg2dbh & !dbhSpecial & !nanoLatch[ NANO_RXH_DBH];   
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:920:4: ... Location of nonblocking assignment
  920 |    Nanod.ryh2abh <= Nanod.reg2abh & !abhSpecial & nanoLatch[ NANO_RXH_DBH];     
      |    ^~~~~
%Error-BLKANDNBLK: ../../../../modules/fx68k/fx68k.sv:293:10: Unsupported: Blocked and non-blocking assignments to same variable: 'u_cpu.Nanod'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:790:9: ... Location of blocking assignment
  790 |  assign Nanod.updSsw = Nanod.aob2Ab;
      |         ^~~~~
                   ../../../../modules/fx68k/fx68k.sv:926:4: ... Location of nonblocking assignment
  926 |    Nanod.isRmc <= Irdecod.isTas & nanoLatch[ NANO_BUSBYTE];
      |    ^~~~~
%Warning-UNOPTFLAT: ../../hdl/jtoutrun_road.v:58:17: Signal unoptimizable: Feedback to clock or circular logic: 'game_test.u_game.u_video.u_road.rrc'
   58 |     reg  [ 4:0] rrc;
      |                 ^~~
                    ../../hdl/jtoutrun_road.v:58:17:      Example path: game_test.u_game.u_video.u_road.rrc
                    ../../hdl/jtoutrun_road.v:147:5:      Example path: ALWAYS
                    ../../hdl/jtoutrun_road.v:58:17:      Example path: game_test.u_game.u_video.u_road.rrc
%Warning-UNOPTFLAT: ../../../../modules/fx68k/fx68kAlu.sv:460:12: Signal unoptimizable: Feedback to clock or circular logic: 'game_test.u_game.u_main.u_cpu.u_cpu.excUnit.alu.aluCorf.htemp'
                                                                : ... In instance game_test.u_game.u_main.u_cpu
  460 |  reg [8:0] htemp;
      |            ^~~~~
                    ../../../../modules/fx68k/fx68kAlu.sv:460:12:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.excUnit.alu.aluCorf.htemp
                    ../../../../modules/fx68k/fx68kAlu.sv:464:13:      Example path: ALWAYS
                    ../../../../modules/fx68k/fx68kAlu.sv:464:7:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.excUnit.alu.aluCorf.highC
                    ../../../../modules/fx68k/fx68kAlu.sv:466:2:      Example path: ALWAYS
                    ../../../../modules/fx68k/fx68kAlu.sv:460:12:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.excUnit.alu.aluCorf.htemp
%Warning-UNOPTFLAT: ../../../../modules/fx68k/fx68k.sv:881:7: Signal unoptimizable: Feedback to clock or circular logic: 'game_test.u_game.u_main.u_cpu.u_cpu.nDecoder.isPcRel'
                                                            : ... In instance game_test.u_game.u_main.u_cpu
  881 |  wire isPcRel = Irdecod.isPcRel & !Nanod.rz;
      |       ^~~~~~~
                    ../../../../modules/fx68k/fx68k.sv:881:7:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.nDecoder.isPcRel
                    ../../../../modules/fx68k/fx68k.sv:887:22:      Example path: ASSIGNW
                    ../../../../modules/fx68k/fx68k.sv:293:10:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.Nanod
                    ../../../../modules/fx68k/fx68k.sv:881:15:      Example path: ASSIGNW
                    ../../../../modules/fx68k/fx68k.sv:881:7:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.nDecoder.isPcRel
%Warning-UNOPTFLAT: ../../../../modules/fx68k/fx68k.sv:166:9: Signal unoptimizable: Feedback to clock or circular logic: 'game_test.u_game.u_sub.u_cpu.u_cpu.Clks'
                                                            : ... In instance game_test.u_game.u_sub.u_cpu
  166 |  s_clks Clks;
      |         ^~~~
                    ../../../../modules/fx68k/fx68k.sv:166:9:      Example path: game_test.u_game.u_sub.u_cpu.u_cpu.Clks
                    ../../../../modules/fx68k/fx68k.sv:257:20:      Example path: ASSIGNW
                    ../../../../modules/fx68k/fx68k.sv:2482:23:      Example path: game_test.u_game.u_sub.u_cpu.u_cpu.__Vcellinp__nanoRom__clk
                    ../../../../modules/fx68k/fx68k.sv:216:4:      Example path: ACTIVE
                    ../../../../modules/fx68k/fx68k.sv:216:4:      Example path: ASSIGNPRE
                    ../../../../modules/fx68k/fx68k.sv:208:14:      Example path: game_test.u_game.u_sub.u_cpu.__Vdly__u_cpu.rBerr
                    ../../../../modules/fx68k/fx68k.sv:214:2:      Example path: ALWAYS
                    ../../../../modules/fx68k/fx68k.sv:166:9:      Example path: game_test.u_game.u_sub.u_cpu.u_cpu.Clks
                    ../../../../modules/fx68k/fx68k.sv:168:18:      Example path: ASSIGNW
                    ../../../../modules/fx68k/fx68k.sv:166:9:      Example path: game_test.u_game.u_sub.u_cpu.u_cpu.Clks
%Warning-UNOPTFLAT: ../../../../modules/fx68k/fx68k.sv:295:12: Signal unoptimizable: Feedback to clock or circular logic: 'game_test.u_game.u_main.u_cpu.u_cpu.Irdecod'
                                                             : ... In instance game_test.u_game.u_main.u_cpu
  295 |  s_irdecod Irdecod;
      |            ^~~~~~~
                    ../../../../modules/fx68k/fx68k.sv:295:12:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.Irdecod
                    ../../../../modules/fx68k/fx68k.sv:961:2:      Example path: ALWAYS
                    ../../../../modules/fx68k/fx68k.sv:295:12:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.Irdecod
%Warning-UNOPTFLAT: ../../../../modules/fx68k/fx68k.sv:293:10: Signal unoptimizable: Feedback to clock or circular logic: 'game_test.u_game.u_main.u_cpu.u_cpu.Nanod'
                                                             : ... In instance game_test.u_game.u_main.u_cpu
  293 |  s_nanod Nanod;
      |          ^~~~~
                    ../../../../modules/fx68k/fx68k.sv:293:10:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.Nanod
                    ../../../../modules/fx68k/fx68k.sv:790:22:      Example path: ASSIGNW
                    ../../../../modules/fx68k/fx68k.sv:293:10:      Example path: game_test.u_game.u_main.u_cpu.u_cpu.Nanod
%Error: Exiting due to 33 error(s)