SPI Verilog added
diff --git a/verilog/rtl/SPI.v b/verilog/rtl/SPI.v
new file mode 100644
index 0000000..410f830
--- /dev/null
+++ b/verilog/rtl/SPI.v
@@ -0,0 +1,828 @@
+module SPI( // @[:@3499.2]
+  input         clock, // @[:@3500.4]
+  input         reset, // @[:@3501.4]
+  input         io_spi_select, // @[:@3502.4]
+  output        io_spi_cs, // @[:@3502.4]
+  output        io_spi_clk, // @[:@3502.4]
+  output        io_spi_mosi, // @[:@3502.4]
+  input         io_spi_miso, // @[:@3502.4]
+  output        io_spi_intr, // @[:@3502.4]
+  input  [15:0] io_wbs_m2s_addr, // @[:@3502.4]
+  input  [31:0] io_wbs_m2s_data, // @[:@3502.4]
+  input         io_wbs_m2s_we, // @[:@3502.4]
+  input         io_wbs_m2s_stb, // @[:@3502.4]
+  output        io_wbs_ack_o, // @[:@3502.4]
+  output [31:0] io_wbs_data_o // @[:@3502.4]
+);
+  reg  ack_o; // @[spi.scala 65:25:@3504.4]
+  reg [31:0] _RAND_0;
+  reg [7:0] rd_data; // @[spi.scala 66:25:@3505.4]
+  reg [31:0] _RAND_1;
+  reg  sclk_r; // @[spi.scala 69:23:@3507.4]
+  reg [31:0] _RAND_2;
+  reg  mosi_r; // @[spi.scala 70:23:@3508.4]
+  reg [31:0] _RAND_3;
+  reg  read_wait_done; // @[spi.scala 75:31:@3515.4]
+  reg [31:0] _RAND_4;
+  reg [7:0] reg_rxdata; // @[spi.scala 78:28:@3518.4]
+  reg [31:0] _RAND_5;
+  reg [7:0] reg_txdata; // @[spi.scala 79:28:@3519.4]
+  reg [31:0] _RAND_6;
+  reg  reg_ssmask; // @[spi.scala 80:28:@3520.4]
+  reg [31:0] _RAND_7;
+  reg [7:0] rx_shift_data; // @[spi.scala 82:30:@3521.4]
+  reg [31:0] _RAND_8;
+  reg [7:0] tx_shift_data; // @[spi.scala 83:30:@3522.4]
+  reg [31:0] _RAND_9;
+  reg  rx_latch_flag; // @[spi.scala 84:30:@3523.4]
+  reg [31:0] _RAND_10;
+  reg  bit_iroe; // @[spi.scala 87:27:@3524.4]
+  reg [31:0] _RAND_11;
+  reg  bit_itoe; // @[spi.scala 88:27:@3525.4]
+  reg [31:0] _RAND_12;
+  reg  bit_itrdy; // @[spi.scala 89:27:@3526.4]
+  reg [31:0] _RAND_13;
+  reg  bit_irrdy; // @[spi.scala 90:27:@3527.4]
+  reg [31:0] _RAND_14;
+  reg  bit_ie; // @[spi.scala 91:27:@3528.4]
+  reg [31:0] _RAND_15;
+  reg  bit_sso; // @[spi.scala 92:27:@3529.4]
+  reg [31:0] _RAND_16;
+  reg  bit_toe; // @[spi.scala 95:27:@3530.4]
+  reg [31:0] _RAND_17;
+  reg  bit_roe; // @[spi.scala 96:27:@3531.4]
+  reg [31:0] _RAND_18;
+  reg  bit_trdy; // @[spi.scala 97:27:@3532.4]
+  reg [31:0] _RAND_19;
+  reg  bit_rrdy; // @[spi.scala 98:27:@3533.4]
+  reg [31:0] _RAND_20;
+  reg  bit_tmt; // @[spi.scala 99:27:@3534.4]
+  reg [31:0] _RAND_21;
+  reg  bit_e; // @[spi.scala 100:27:@3535.4]
+  reg [31:0] _RAND_22;
+  wire [7:0] addr; // @[spi.scala 106:33:@3536.4]
+  wire  _T_104; // @[spi.scala 108:19:@3537.4]
+  wire  rd_en; // @[spi.scala 108:34:@3538.4]
+  wire  wr_en; // @[spi.scala 109:33:@3541.4]
+  wire  _T_115; // @[spi.scala 113:32:@3545.4]
+  wire  sel_reg_rx; // @[spi.scala 113:54:@3546.4]
+  wire  _T_116; // @[spi.scala 114:32:@3547.4]
+  wire  sel_reg_tx; // @[spi.scala 114:54:@3548.4]
+  wire  _T_118; // @[spi.scala 116:32:@3551.4]
+  wire  sel_reg_control; // @[spi.scala 116:55:@3552.4]
+  wire  _T_119; // @[spi.scala 117:32:@3553.4]
+  wire  sel_reg_status; // @[spi.scala 117:54:@3554.4]
+  wire  _T_120; // @[spi.scala 118:32:@3555.4]
+  wire  sel_reg_ssmask; // @[spi.scala 118:55:@3556.4]
+  wire [7:0] _GEN_0; // @[spi.scala 121:23:@3557.4]
+  wire  _T_121; // @[spi.scala 126:14:@3560.4]
+  wire  _T_122; // @[spi.scala 126:28:@3561.4]
+  wire [7:0] latch_s_data; // @[:@3516.4 :@3517.4 spi.scala 110:16:@3544.4]
+  wire [7:0] _GEN_1; // @[spi.scala 126:41:@3562.4]
+  wire  _T_123; // @[spi.scala 131:19:@3565.4]
+  wire [7:0] reg_status; // @[Cat.scala 30:58:@3572.4]
+  wire [7:0] reg_control; // @[Cat.scala 30:58:@3579.4]
+  wire  _T_138; // @[spi.scala 138:14:@3580.4]
+  wire  _T_139; // @[spi.scala 139:30:@3582.6]
+  wire  _T_140; // @[spi.scala 140:30:@3584.6]
+  wire  _T_141; // @[spi.scala 141:30:@3586.6]
+  wire  _T_142; // @[spi.scala 142:30:@3588.6]
+  wire  _T_143; // @[spi.scala 143:30:@3590.6]
+  wire  _T_144; // @[spi.scala 144:30:@3592.6]
+  wire  _GEN_2; // @[spi.scala 138:34:@3581.4]
+  wire  _GEN_3; // @[spi.scala 138:34:@3581.4]
+  wire  _GEN_4; // @[spi.scala 138:34:@3581.4]
+  wire  _GEN_5; // @[spi.scala 138:34:@3581.4]
+  wire  _GEN_6; // @[spi.scala 138:34:@3581.4]
+  wire  _GEN_7; // @[spi.scala 138:34:@3581.4]
+  wire  _T_145; // @[spi.scala 147:37:@3595.4]
+  wire  _T_146; // @[spi.scala 147:58:@3596.4]
+  wire  _T_147; // @[spi.scala 147:47:@3597.4]
+  wire  _T_148; // @[spi.scala 147:25:@3598.4]
+  wire  _T_149; // @[spi.scala 147:83:@3599.4]
+  wire  _T_150; // @[spi.scala 147:70:@3600.4]
+  wire  _T_151; // @[spi.scala 147:108:@3601.4]
+  wire  _T_155; // @[spi.scala 154:39:@3609.6]
+  wire  _T_156; // @[spi.scala 154:30:@3610.6]
+  wire  _GEN_8; // @[spi.scala 154:59:@3611.6]
+  wire  _GEN_9; // @[spi.scala 152:15:@3604.4]
+  wire  _T_160; // @[spi.scala 161:35:@3620.6]
+  wire  _T_161; // @[spi.scala 161:30:@3621.6]
+  wire  _GEN_10; // @[spi.scala 161:43:@3622.6]
+  wire  _GEN_11; // @[spi.scala 159:15:@3615.4]
+  reg [4:0] clock_cnt; // @[spi.scala 166:31:@3625.4]
+  reg [31:0] _RAND_23;
+  reg [5:0] data_cnt; // @[spi.scala 167:31:@3626.4]
+  reg [31:0] _RAND_24;
+  reg  pending_data; // @[spi.scala 168:31:@3627.4]
+  reg [31:0] _RAND_25;
+  reg [2:0] n_status; // @[spi.scala 170:31:@3630.4]
+  reg [31:0] _RAND_26;
+  reg [2:0] p_status; // @[spi.scala 171:31:@3631.4]
+  reg [31:0] _RAND_27;
+  wire  _T_174; // @[spi.scala 175:27:@3637.6]
+  wire  _GEN_12; // @[spi.scala 175:40:@3638.6]
+  wire  _GEN_13; // @[spi.scala 173:32:@3633.4]
+  wire [7:0] _T_180; // @[spi.scala 181:78:@3644.6]
+  wire [7:0] _T_181; // @[spi.scala 181:44:@3645.6]
+  wire [7:0] _T_182; // @[spi.scala 181:12:@3646.6]
+  wire [7:0] _T_183; // @[spi.scala 180:49:@3647.6]
+  wire [7:0] _T_184; // @[spi.scala 180:21:@3648.6]
+  wire [7:0] _GEN_14; // @[spi.scala 179:18:@3641.4]
+  wire  _T_185; // @[spi.scala 185:16:@3652.4]
+  wire  _GEN_15; // @[spi.scala 185:35:@3653.4]
+  wire  _T_188; // @[spi.scala 201:21:@3659.4]
+  wire  _T_190; // @[spi.scala 201:49:@3660.4]
+  wire  _T_191; // @[spi.scala 201:35:@3661.4]
+  wire  _T_192; // @[spi.scala 202:18:@3663.6]
+  wire  _GEN_16; // @[spi.scala 201:67:@3662.4]
+  wire  _T_196; // @[spi.scala 208:59:@3669.4]
+  wire  _T_197; // @[spi.scala 208:39:@3670.4]
+  wire  _T_199; // @[spi.scala 208:71:@3672.4]
+  wire [8:0] _T_203; // @[Cat.scala 30:58:@3680.8]
+  wire [8:0] _GEN_18; // @[spi.scala 208:99:@3673.4]
+  wire  _T_204; // @[spi.scala 217:20:@3684.4]
+  wire  _T_205; // @[spi.scala 217:47:@3685.4]
+  wire  _T_206; // @[spi.scala 217:34:@3686.4]
+  wire  _GEN_19; // @[spi.scala 219:33:@3691.6]
+  wire  _GEN_20; // @[spi.scala 217:62:@3687.4]
+  wire  _T_211; // @[spi.scala 223:49:@3695.4]
+  wire  _T_212; // @[spi.scala 223:36:@3696.4]
+  wire [5:0] _T_215; // @[spi.scala 226:30:@3701.6]
+  wire [4:0] _T_216; // @[spi.scala 226:30:@3702.6]
+  wire [4:0] _GEN_21; // @[spi.scala 223:63:@3697.4]
+  wire [2:0] _GEN_22; // @[spi.scala 235:26:@3713.6]
+  wire  _T_229; // @[spi.scala 246:27:@3732.8]
+  wire  _T_233; // @[spi.scala 247:53:@3735.10]
+  wire  _T_234; // @[spi.scala 247:40:@3736.10]
+  wire [2:0] _GEN_24; // @[spi.scala 247:76:@3737.10]
+  wire  _T_238; // @[spi.scala 253:53:@3748.12]
+  wire  _T_239; // @[spi.scala 253:40:@3749.12]
+  wire  _T_242; // @[spi.scala 253:69:@3751.12]
+  wire [2:0] _GEN_25; // @[spi.scala 253:105:@3752.12]
+  wire  _T_243; // @[spi.scala 258:27:@3760.12]
+  wire [2:0] _GEN_27; // @[spi.scala 259:39:@3763.14]
+  wire  _T_247; // @[spi.scala 266:27:@3773.14]
+  wire  _T_251; // @[spi.scala 267:53:@3776.16]
+  wire  _T_252; // @[spi.scala 267:40:@3777.16]
+  wire [2:0] _GEN_28; // @[spi.scala 267:77:@3778.16]
+  wire [2:0] _GEN_29; // @[spi.scala 266:44:@3774.14]
+  wire [2:0] _GEN_30; // @[spi.scala 258:46:@3761.12]
+  wire [2:0] _GEN_31; // @[spi.scala 252:41:@3746.10]
+  wire [2:0] _GEN_32; // @[spi.scala 246:40:@3733.8]
+  wire [2:0] _GEN_33; // @[spi.scala 240:40:@3722.6]
+  wire [2:0] _GEN_34; // @[spi.scala 234:32:@3712.4]
+  wire  _T_256; // @[spi.scala 276:32:@3790.4]
+  wire  _T_259; // @[spi.scala 276:63:@3792.4]
+  wire  _T_266; // @[spi.scala 278:73:@3801.6]
+  wire  _T_269; // @[spi.scala 278:102:@3803.6]
+  wire  _T_274; // @[spi.scala 280:45:@3810.8]
+  wire  _T_277; // @[spi.scala 280:76:@3812.8]
+  wire  _T_291; // @[spi.scala 282:133:@3825.10]
+  wire  _T_292; // @[spi.scala 282:74:@3826.10]
+  wire  _T_297; // @[spi.scala 282:174:@3830.10]
+  wire [6:0] _T_299; // @[spi.scala 283:28:@3832.12]
+  wire [5:0] _T_300; // @[spi.scala 283:28:@3833.12]
+  wire [5:0] _GEN_35; // @[spi.scala 282:238:@3831.10]
+  wire [5:0] _GEN_36; // @[spi.scala 280:113:@3813.8]
+  wire [5:0] _GEN_37; // @[spi.scala 278:138:@3804.6]
+  wire [5:0] _GEN_38; // @[spi.scala 276:99:@3793.4]
+  reg  wait_one_tick_done; // @[spi.scala 286:37:@3836.4]
+  reg [31:0] _RAND_28;
+  wire  _T_321; // @[spi.scala 298:72:@3858.6]
+  wire [8:0] _T_328; // @[Cat.scala 30:58:@3863.6]
+  wire  _T_341; // @[spi.scala 302:80:@3877.10]
+  wire [8:0] _T_348; // @[Cat.scala 30:58:@3882.10]
+  wire  _GEN_42; // @[spi.scala 301:32:@3875.8]
+  wire [8:0] _GEN_43; // @[spi.scala 301:32:@3875.8]
+  wire  _GEN_44; // @[spi.scala 300:114:@3874.6]
+  wire [8:0] _GEN_45; // @[spi.scala 300:114:@3874.6]
+  wire  _GEN_46; // @[spi.scala 297:37:@3856.4]
+  wire [8:0] _GEN_47; // @[spi.scala 297:37:@3856.4]
+  wire  _GEN_48; // @[spi.scala 310:39:@3894.6]
+  wire  _GEN_49; // @[spi.scala 308:36:@3889.4]
+  wire  _T_355; // @[spi.scala 314:12:@3897.4]
+  wire  _T_356; // @[spi.scala 314:22:@3898.4]
+  wire  _T_357; // @[spi.scala 314:31:@3899.4]
+  wire  _T_359; // @[spi.scala 316:24:@3904.6]
+  wire  _GEN_50; // @[spi.scala 316:43:@3905.6]
+  wire  _GEN_51; // @[spi.scala 314:46:@3900.4]
+  wire  _T_364; // @[spi.scala 320:40:@3910.4]
+  wire  _GEN_52; // @[spi.scala 321:22:@3912.6]
+  wire  _GEN_53; // @[spi.scala 321:22:@3912.6]
+  wire  _T_367; // @[spi.scala 326:24:@3920.6]
+  wire  _GEN_54; // @[spi.scala 326:39:@3921.6]
+  wire  _GEN_55; // @[spi.scala 326:39:@3921.6]
+  wire  _GEN_56; // @[spi.scala 320:72:@3911.4]
+  wire  _GEN_57; // @[spi.scala 320:72:@3911.4]
+  wire  _T_370; // @[spi.scala 331:21:@3925.4]
+  wire  _T_371; // @[spi.scala 331:34:@3926.4]
+  wire  _GEN_58; // @[spi.scala 331:51:@3927.4]
+  assign addr = io_wbs_m2s_addr[7:0]; // @[spi.scala 106:33:@3536.4]
+  assign _T_104 = io_wbs_m2s_we == 1'h0; // @[spi.scala 108:19:@3537.4]
+  assign rd_en = _T_104 & io_wbs_m2s_stb; // @[spi.scala 108:34:@3538.4]
+  assign wr_en = io_wbs_m2s_we & io_wbs_m2s_stb; // @[spi.scala 109:33:@3541.4]
+  assign _T_115 = addr == 8'h0; // @[spi.scala 113:32:@3545.4]
+  assign sel_reg_rx = _T_115 & io_spi_select; // @[spi.scala 113:54:@3546.4]
+  assign _T_116 = addr == 8'h1; // @[spi.scala 114:32:@3547.4]
+  assign sel_reg_tx = _T_116 & io_spi_select; // @[spi.scala 114:54:@3548.4]
+  assign _T_118 = addr == 8'h3; // @[spi.scala 116:32:@3551.4]
+  assign sel_reg_control = _T_118 & io_spi_select; // @[spi.scala 116:55:@3552.4]
+  assign _T_119 = addr == 8'h4; // @[spi.scala 117:32:@3553.4]
+  assign sel_reg_status = _T_119 & io_spi_select; // @[spi.scala 117:54:@3554.4]
+  assign _T_120 = addr == 8'h5; // @[spi.scala 118:32:@3555.4]
+  assign sel_reg_ssmask = _T_120 & io_spi_select; // @[spi.scala 118:55:@3556.4]
+  assign _GEN_0 = rx_latch_flag ? rx_shift_data : reg_rxdata; // @[spi.scala 121:23:@3557.4]
+  assign _T_121 = wr_en & sel_reg_tx; // @[spi.scala 126:14:@3560.4]
+  assign _T_122 = _T_121 & bit_trdy; // @[spi.scala 126:28:@3561.4]
+  assign latch_s_data = io_wbs_m2s_data[7:0]; // @[:@3516.4 :@3517.4 spi.scala 110:16:@3544.4]
+  assign _GEN_1 = _T_122 ? latch_s_data : reg_txdata; // @[spi.scala 126:41:@3562.4]
+  assign _T_123 = bit_toe | bit_roe; // @[spi.scala 131:19:@3565.4]
+  assign reg_status = {bit_e,bit_rrdy,bit_trdy,bit_tmt,bit_toe,bit_roe,2'h0}; // @[Cat.scala 30:58:@3572.4]
+  assign reg_control = {bit_sso,1'h0,bit_ie,bit_irrdy,bit_itrdy,1'h0,bit_itoe,bit_iroe}; // @[Cat.scala 30:58:@3579.4]
+  assign _T_138 = wr_en & sel_reg_control; // @[spi.scala 138:14:@3580.4]
+  assign _T_139 = latch_s_data[0]; // @[spi.scala 139:30:@3582.6]
+  assign _T_140 = latch_s_data[1]; // @[spi.scala 140:30:@3584.6]
+  assign _T_141 = latch_s_data[3]; // @[spi.scala 141:30:@3586.6]
+  assign _T_142 = latch_s_data[4]; // @[spi.scala 142:30:@3588.6]
+  assign _T_143 = latch_s_data[5]; // @[spi.scala 143:30:@3590.6]
+  assign _T_144 = latch_s_data[7]; // @[spi.scala 144:30:@3592.6]
+  assign _GEN_2 = _T_138 ? _T_139 : bit_iroe; // @[spi.scala 138:34:@3581.4]
+  assign _GEN_3 = _T_138 ? _T_140 : bit_itoe; // @[spi.scala 138:34:@3581.4]
+  assign _GEN_4 = _T_138 ? _T_141 : bit_itrdy; // @[spi.scala 138:34:@3581.4]
+  assign _GEN_5 = _T_138 ? _T_142 : bit_irrdy; // @[spi.scala 138:34:@3581.4]
+  assign _GEN_6 = _T_138 ? _T_143 : bit_ie; // @[spi.scala 138:34:@3581.4]
+  assign _GEN_7 = _T_138 ? _T_144 : bit_sso; // @[spi.scala 138:34:@3581.4]
+  assign _T_145 = bit_iroe & bit_roe; // @[spi.scala 147:37:@3595.4]
+  assign _T_146 = bit_itoe & bit_toe; // @[spi.scala 147:58:@3596.4]
+  assign _T_147 = _T_145 | _T_146; // @[spi.scala 147:47:@3597.4]
+  assign _T_148 = bit_ie & _T_147; // @[spi.scala 147:25:@3598.4]
+  assign _T_149 = bit_itrdy & bit_trdy; // @[spi.scala 147:83:@3599.4]
+  assign _T_150 = _T_148 | _T_149; // @[spi.scala 147:70:@3600.4]
+  assign _T_151 = bit_irrdy & bit_rrdy; // @[spi.scala 147:108:@3601.4]
+  assign _T_155 = io_wbs_m2s_we | read_wait_done; // @[spi.scala 154:39:@3609.6]
+  assign _T_156 = io_wbs_m2s_stb & _T_155; // @[spi.scala 154:30:@3610.6]
+  assign _GEN_8 = _T_156 ? 1'h1 : ack_o; // @[spi.scala 154:59:@3611.6]
+  assign _GEN_9 = ack_o ? 1'h0 : _GEN_8; // @[spi.scala 152:15:@3604.4]
+  assign _T_160 = ~ io_wbs_m2s_we; // @[spi.scala 161:35:@3620.6]
+  assign _T_161 = io_wbs_m2s_stb & _T_160; // @[spi.scala 161:30:@3621.6]
+  assign _GEN_10 = _T_161 ? 1'h1 : read_wait_done; // @[spi.scala 161:43:@3622.6]
+  assign _GEN_11 = ack_o ? 1'h0 : _GEN_10; // @[spi.scala 159:15:@3615.4]
+  assign _T_174 = n_status == 3'h1; // @[spi.scala 175:27:@3637.6]
+  assign _GEN_12 = _T_174 ? 1'h0 : pending_data; // @[spi.scala 175:40:@3638.6]
+  assign _GEN_13 = _T_121 ? 1'h1 : _GEN_12; // @[spi.scala 173:32:@3633.4]
+  assign _T_180 = sel_reg_ssmask ? {{7'd0}, reg_ssmask} : 8'h0; // @[spi.scala 181:78:@3644.6]
+  assign _T_181 = sel_reg_control ? reg_control : _T_180; // @[spi.scala 181:44:@3645.6]
+  assign _T_182 = sel_reg_status ? reg_status : _T_181; // @[spi.scala 181:12:@3646.6]
+  assign _T_183 = sel_reg_tx ? reg_txdata : _T_182; // @[spi.scala 180:49:@3647.6]
+  assign _T_184 = sel_reg_rx ? reg_rxdata : _T_183; // @[spi.scala 180:21:@3648.6]
+  assign _GEN_14 = rd_en ? _T_184 : rd_data; // @[spi.scala 179:18:@3641.4]
+  assign _T_185 = wr_en & sel_reg_ssmask; // @[spi.scala 185:16:@3652.4]
+  assign _GEN_15 = _T_185 ? _T_139 : reg_ssmask; // @[spi.scala 185:35:@3653.4]
+  assign _T_188 = n_status == 3'h3; // @[spi.scala 201:21:@3659.4]
+  assign _T_190 = clock_cnt == 5'h3; // @[spi.scala 201:49:@3660.4]
+  assign _T_191 = _T_188 & _T_190; // @[spi.scala 201:35:@3661.4]
+  assign _T_192 = ~ sclk_r; // @[spi.scala 202:18:@3663.6]
+  assign _GEN_16 = _T_191 ? _T_192 : sclk_r; // @[spi.scala 201:67:@3662.4]
+  assign _T_196 = 1'h0 == sclk_r; // @[spi.scala 208:59:@3669.4]
+  assign _T_197 = _T_190 & _T_196; // @[spi.scala 208:39:@3670.4]
+  assign _T_199 = _T_197 & _T_188; // @[spi.scala 208:71:@3672.4]
+  assign _T_203 = {rx_shift_data,io_spi_miso}; // @[Cat.scala 30:58:@3680.8]
+  assign _GEN_18 = _T_199 ? _T_203 : {{1'd0}, rx_shift_data}; // @[spi.scala 208:99:@3673.4]
+  assign _T_204 = p_status == 3'h3; // @[spi.scala 217:20:@3684.4]
+  assign _T_205 = n_status != 3'h3; // @[spi.scala 217:47:@3685.4]
+  assign _T_206 = _T_204 & _T_205; // @[spi.scala 217:34:@3686.4]
+  assign _GEN_19 = rx_latch_flag ? 1'h0 : rx_latch_flag; // @[spi.scala 219:33:@3691.6]
+  assign _GEN_20 = _T_206 ? 1'h1 : _GEN_19; // @[spi.scala 217:62:@3687.4]
+  assign _T_211 = n_status == 3'h0; // @[spi.scala 223:49:@3695.4]
+  assign _T_212 = _T_190 | _T_211; // @[spi.scala 223:36:@3696.4]
+  assign _T_215 = clock_cnt + 5'h1; // @[spi.scala 226:30:@3701.6]
+  assign _T_216 = clock_cnt + 5'h1; // @[spi.scala 226:30:@3702.6]
+  assign _GEN_21 = _T_212 ? 5'h0 : _T_216; // @[spi.scala 223:63:@3697.4]
+  assign _GEN_22 = pending_data ? 3'h1 : 3'h0; // @[spi.scala 235:26:@3713.6]
+  assign _T_229 = n_status == 3'h2; // @[spi.scala 246:27:@3732.8]
+  assign _T_233 = data_cnt == 6'h1; // @[spi.scala 247:53:@3735.10]
+  assign _T_234 = _T_190 & _T_233; // @[spi.scala 247:40:@3736.10]
+  assign _GEN_24 = _T_234 ? 3'h3 : 3'h2; // @[spi.scala 247:76:@3737.10]
+  assign _T_238 = data_cnt == 6'h7; // @[spi.scala 253:53:@3748.12]
+  assign _T_239 = _T_190 & _T_238; // @[spi.scala 253:40:@3749.12]
+  assign _T_242 = _T_239 & sclk_r; // @[spi.scala 253:69:@3751.12]
+  assign _GEN_25 = _T_242 ? 3'h4 : 3'h3; // @[spi.scala 253:105:@3752.12]
+  assign _T_243 = n_status == 3'h4; // @[spi.scala 258:27:@3760.12]
+  assign _GEN_27 = _T_190 ? 3'h5 : n_status; // @[spi.scala 259:39:@3763.14]
+  assign _T_247 = n_status == 3'h5; // @[spi.scala 266:27:@3773.14]
+  assign _T_251 = data_cnt == 6'h2; // @[spi.scala 267:53:@3776.16]
+  assign _T_252 = _T_190 & _T_251; // @[spi.scala 267:40:@3777.16]
+  assign _GEN_28 = _T_252 ? 3'h0 : 3'h5; // @[spi.scala 267:77:@3778.16]
+  assign _GEN_29 = _T_247 ? _GEN_28 : 3'h0; // @[spi.scala 266:44:@3774.14]
+  assign _GEN_30 = _T_243 ? _GEN_27 : _GEN_29; // @[spi.scala 258:46:@3761.12]
+  assign _GEN_31 = _T_188 ? _GEN_25 : _GEN_30; // @[spi.scala 252:41:@3746.10]
+  assign _GEN_32 = _T_229 ? _GEN_24 : _GEN_31; // @[spi.scala 246:40:@3733.8]
+  assign _GEN_33 = _T_174 ? 3'h2 : _GEN_32; // @[spi.scala 240:40:@3722.6]
+  assign _GEN_34 = _T_211 ? _GEN_22 : _GEN_33; // @[spi.scala 234:32:@3712.4]
+  assign _T_256 = _T_229 & _T_190; // @[spi.scala 276:32:@3790.4]
+  assign _T_259 = _T_256 & _T_233; // @[spi.scala 276:63:@3792.4]
+  assign _T_266 = _T_191 & _T_238; // @[spi.scala 278:73:@3801.6]
+  assign _T_269 = _T_266 & sclk_r; // @[spi.scala 278:102:@3803.6]
+  assign _T_274 = _T_247 & _T_190; // @[spi.scala 280:45:@3810.8]
+  assign _T_277 = _T_274 & _T_251; // @[spi.scala 280:76:@3812.8]
+  assign _T_291 = _T_191 & sclk_r; // @[spi.scala 282:133:@3825.10]
+  assign _T_292 = _T_256 | _T_291; // @[spi.scala 282:74:@3826.10]
+  assign _T_297 = _T_292 | _T_274; // @[spi.scala 282:174:@3830.10]
+  assign _T_299 = data_cnt + 6'h1; // @[spi.scala 283:28:@3832.12]
+  assign _T_300 = data_cnt + 6'h1; // @[spi.scala 283:28:@3833.12]
+  assign _GEN_35 = _T_297 ? _T_300 : data_cnt; // @[spi.scala 282:238:@3831.10]
+  assign _GEN_36 = _T_277 ? 6'h0 : _GEN_35; // @[spi.scala 280:113:@3813.8]
+  assign _GEN_37 = _T_269 ? 6'h0 : _GEN_36; // @[spi.scala 278:138:@3804.6]
+  assign _GEN_38 = _T_259 ? 6'h0 : _GEN_37; // @[spi.scala 276:99:@3793.4]
+  assign _T_321 = reg_txdata[7]; // @[spi.scala 298:72:@3858.6]
+  assign _T_328 = {reg_txdata,1'h0}; // @[Cat.scala 30:58:@3863.6]
+  assign _T_341 = tx_shift_data[7]; // @[spi.scala 302:80:@3877.10]
+  assign _T_348 = {tx_shift_data,1'h0}; // @[Cat.scala 30:58:@3882.10]
+  assign _GEN_42 = wait_one_tick_done ? _T_341 : mosi_r; // @[spi.scala 301:32:@3875.8]
+  assign _GEN_43 = wait_one_tick_done ? _T_348 : {{1'd0}, tx_shift_data}; // @[spi.scala 301:32:@3875.8]
+  assign _GEN_44 = _T_291 ? _GEN_42 : mosi_r; // @[spi.scala 300:114:@3874.6]
+  assign _GEN_45 = _T_291 ? _GEN_43 : {{1'd0}, tx_shift_data}; // @[spi.scala 300:114:@3874.6]
+  assign _GEN_46 = _T_229 ? _T_321 : _GEN_44; // @[spi.scala 297:37:@3856.4]
+  assign _GEN_47 = _T_229 ? _T_328 : _GEN_45; // @[spi.scala 297:37:@3856.4]
+  assign _GEN_48 = _T_121 ? 1'h0 : bit_trdy; // @[spi.scala 310:39:@3894.6]
+  assign _GEN_49 = _T_188 ? 1'h1 : _GEN_48; // @[spi.scala 308:36:@3889.4]
+  assign _T_355 = bit_trdy == 1'h0; // @[spi.scala 314:12:@3897.4]
+  assign _T_356 = _T_355 & wr_en; // @[spi.scala 314:22:@3898.4]
+  assign _T_357 = _T_356 & sel_reg_tx; // @[spi.scala 314:31:@3899.4]
+  assign _T_359 = wr_en & sel_reg_status; // @[spi.scala 316:24:@3904.6]
+  assign _GEN_50 = _T_359 ? 1'h0 : bit_toe; // @[spi.scala 316:43:@3905.6]
+  assign _GEN_51 = _T_357 ? 1'h1 : _GEN_50; // @[spi.scala 314:46:@3900.4]
+  assign _T_364 = _T_243 & _T_190; // @[spi.scala 320:40:@3910.4]
+  assign _GEN_52 = bit_rrdy ? 1'h1 : bit_roe; // @[spi.scala 321:22:@3912.6]
+  assign _GEN_53 = bit_rrdy ? bit_rrdy : 1'h1; // @[spi.scala 321:22:@3912.6]
+  assign _T_367 = rd_en & sel_reg_rx; // @[spi.scala 326:24:@3920.6]
+  assign _GEN_54 = _T_367 ? 1'h0 : bit_rrdy; // @[spi.scala 326:39:@3921.6]
+  assign _GEN_55 = _T_367 ? 1'h0 : bit_roe; // @[spi.scala 326:39:@3921.6]
+  assign _GEN_56 = _T_364 ? _GEN_52 : _GEN_55; // @[spi.scala 320:72:@3911.4]
+  assign _GEN_57 = _T_364 ? _GEN_53 : _GEN_54; // @[spi.scala 320:72:@3911.4]
+  assign _T_370 = n_status != 3'h0; // @[spi.scala 331:21:@3925.4]
+  assign _T_371 = _T_370 | pending_data; // @[spi.scala 331:34:@3926.4]
+  assign _GEN_58 = _T_371 ? 1'h0 : 1'h1; // @[spi.scala 331:51:@3927.4]
+  assign io_spi_cs = ~ reg_ssmask; // @[spi.scala 198:13:@3658.4]
+  assign io_spi_clk = sclk_r; // @[spi.scala 204:16:@3666.4]
+  assign io_spi_mosi = mosi_r; // @[spi.scala 306:15:@3887.4]
+  assign io_spi_intr = _T_150 | _T_151; // @[spi.scala 147:14:@3603.4]
+  assign io_wbs_ack_o = ack_o; // @[spi.scala 157:15:@3614.4]
+  assign io_wbs_data_o = {{24'd0}, rd_data}; // @[spi.scala 183:18:@3651.4]
+`ifdef RANDOMIZE_GARBAGE_ASSIGN
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_INVALID_ASSIGN
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_REG_INIT
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_MEM_INIT
+`define RANDOMIZE
+`endif
+`ifndef RANDOM
+`define RANDOM $random
+`endif
+`ifdef RANDOMIZE
+  integer initvar;
+  initial begin
+    `ifdef INIT_RANDOM
+      `INIT_RANDOM
+    `endif
+    `ifndef VERILATOR
+      #0.002 begin end
+    `endif
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_0 = {1{`RANDOM}};
+  ack_o = _RAND_0[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_1 = {1{`RANDOM}};
+  rd_data = _RAND_1[7:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_2 = {1{`RANDOM}};
+  sclk_r = _RAND_2[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_3 = {1{`RANDOM}};
+  mosi_r = _RAND_3[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_4 = {1{`RANDOM}};
+  read_wait_done = _RAND_4[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_5 = {1{`RANDOM}};
+  reg_rxdata = _RAND_5[7:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_6 = {1{`RANDOM}};
+  reg_txdata = _RAND_6[7:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_7 = {1{`RANDOM}};
+  reg_ssmask = _RAND_7[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_8 = {1{`RANDOM}};
+  rx_shift_data = _RAND_8[7:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_9 = {1{`RANDOM}};
+  tx_shift_data = _RAND_9[7:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_10 = {1{`RANDOM}};
+  rx_latch_flag = _RAND_10[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_11 = {1{`RANDOM}};
+  bit_iroe = _RAND_11[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_12 = {1{`RANDOM}};
+  bit_itoe = _RAND_12[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_13 = {1{`RANDOM}};
+  bit_itrdy = _RAND_13[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_14 = {1{`RANDOM}};
+  bit_irrdy = _RAND_14[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_15 = {1{`RANDOM}};
+  bit_ie = _RAND_15[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_16 = {1{`RANDOM}};
+  bit_sso = _RAND_16[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_17 = {1{`RANDOM}};
+  bit_toe = _RAND_17[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_18 = {1{`RANDOM}};
+  bit_roe = _RAND_18[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_19 = {1{`RANDOM}};
+  bit_trdy = _RAND_19[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_20 = {1{`RANDOM}};
+  bit_rrdy = _RAND_20[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_21 = {1{`RANDOM}};
+  bit_tmt = _RAND_21[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_22 = {1{`RANDOM}};
+  bit_e = _RAND_22[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_23 = {1{`RANDOM}};
+  clock_cnt = _RAND_23[4:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_24 = {1{`RANDOM}};
+  data_cnt = _RAND_24[5:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_25 = {1{`RANDOM}};
+  pending_data = _RAND_25[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_26 = {1{`RANDOM}};
+  n_status = _RAND_26[2:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_27 = {1{`RANDOM}};
+  p_status = _RAND_27[2:0];
+  `endif // RANDOMIZE_REG_INIT
+  `ifdef RANDOMIZE_REG_INIT
+  _RAND_28 = {1{`RANDOM}};
+  wait_one_tick_done = _RAND_28[0:0];
+  `endif // RANDOMIZE_REG_INIT
+  end
+`endif // RANDOMIZE
+  always @(posedge clock) begin
+    if (reset) begin
+      ack_o <= 1'h0;
+    end else begin
+      if (ack_o) begin
+        ack_o <= 1'h0;
+      end else begin
+        if (_T_156) begin
+          ack_o <= 1'h1;
+        end
+      end
+    end
+    if (reset) begin
+      rd_data <= 8'h0;
+    end else begin
+      if (rd_en) begin
+        if (sel_reg_rx) begin
+          rd_data <= reg_rxdata;
+        end else begin
+          if (sel_reg_tx) begin
+            rd_data <= reg_txdata;
+          end else begin
+            if (sel_reg_status) begin
+              rd_data <= reg_status;
+            end else begin
+              if (sel_reg_control) begin
+                rd_data <= reg_control;
+              end else begin
+                if (sel_reg_ssmask) begin
+                  rd_data <= {{7'd0}, reg_ssmask};
+                end else begin
+                  rd_data <= 8'h0;
+                end
+              end
+            end
+          end
+        end
+      end
+    end
+    if (reset) begin
+      sclk_r <= 1'h0;
+    end else begin
+      if (_T_191) begin
+        sclk_r <= _T_192;
+      end
+    end
+    if (reset) begin
+      mosi_r <= 1'h0;
+    end else begin
+      if (_T_229) begin
+        mosi_r <= _T_321;
+      end else begin
+        if (_T_291) begin
+          if (wait_one_tick_done) begin
+            mosi_r <= _T_341;
+          end
+        end
+      end
+    end
+    if (reset) begin
+      read_wait_done <= 1'h0;
+    end else begin
+      if (ack_o) begin
+        read_wait_done <= 1'h0;
+      end else begin
+        if (_T_161) begin
+          read_wait_done <= 1'h1;
+        end
+      end
+    end
+    if (reset) begin
+      reg_rxdata <= 8'h0;
+    end else begin
+      if (rx_latch_flag) begin
+        reg_rxdata <= rx_shift_data;
+      end
+    end
+    if (reset) begin
+      reg_txdata <= 8'h35;
+    end else begin
+      if (_T_122) begin
+        reg_txdata <= latch_s_data;
+      end
+    end
+    if (reset) begin
+      reg_ssmask <= 1'h0;
+    end else begin
+      if (_T_185) begin
+        reg_ssmask <= _T_139;
+      end
+    end
+    if (reset) begin
+      rx_shift_data <= 8'h0;
+    end else begin
+      rx_shift_data <= _GEN_18[7:0];
+    end
+    if (reset) begin
+      tx_shift_data <= 8'h0;
+    end else begin
+      tx_shift_data <= _GEN_47[7:0];
+    end
+    if (reset) begin
+      rx_latch_flag <= 1'h0;
+    end else begin
+      if (_T_206) begin
+        rx_latch_flag <= 1'h1;
+      end else begin
+        if (rx_latch_flag) begin
+          rx_latch_flag <= 1'h0;
+        end
+      end
+    end
+    if (reset) begin
+      bit_iroe <= 1'h0;
+    end else begin
+      if (_T_138) begin
+        bit_iroe <= _T_139;
+      end
+    end
+    if (reset) begin
+      bit_itoe <= 1'h0;
+    end else begin
+      if (_T_138) begin
+        bit_itoe <= _T_140;
+      end
+    end
+    if (reset) begin
+      bit_itrdy <= 1'h0;
+    end else begin
+      if (_T_138) begin
+        bit_itrdy <= _T_141;
+      end
+    end
+    if (reset) begin
+      bit_irrdy <= 1'h0;
+    end else begin
+      if (_T_138) begin
+        bit_irrdy <= _T_142;
+      end
+    end
+    if (reset) begin
+      bit_ie <= 1'h0;
+    end else begin
+      if (_T_138) begin
+        bit_ie <= _T_143;
+      end
+    end
+    if (reset) begin
+      bit_sso <= 1'h1;
+    end else begin
+      if (_T_138) begin
+        bit_sso <= _T_144;
+      end
+    end
+    if (reset) begin
+      bit_toe <= 1'h0;
+    end else begin
+      if (_T_357) begin
+        bit_toe <= 1'h1;
+      end else begin
+        if (_T_359) begin
+          bit_toe <= 1'h0;
+        end
+      end
+    end
+    if (reset) begin
+      bit_roe <= 1'h0;
+    end else begin
+      if (_T_364) begin
+        if (bit_rrdy) begin
+          bit_roe <= 1'h1;
+        end
+      end else begin
+        if (_T_367) begin
+          bit_roe <= 1'h0;
+        end
+      end
+    end
+    if (reset) begin
+      bit_trdy <= 1'h1;
+    end else begin
+      if (_T_188) begin
+        bit_trdy <= 1'h1;
+      end else begin
+        if (_T_121) begin
+          bit_trdy <= 1'h0;
+        end
+      end
+    end
+    if (reset) begin
+      bit_rrdy <= 1'h0;
+    end else begin
+      if (_T_364) begin
+        if (!(bit_rrdy)) begin
+          bit_rrdy <= 1'h1;
+        end
+      end else begin
+        if (_T_367) begin
+          bit_rrdy <= 1'h0;
+        end
+      end
+    end
+    if (reset) begin
+      bit_tmt <= 1'h1;
+    end else begin
+      if (_T_371) begin
+        bit_tmt <= 1'h0;
+      end else begin
+        bit_tmt <= 1'h1;
+      end
+    end
+    if (reset) begin
+      bit_e <= 1'h0;
+    end else begin
+      bit_e <= _T_123;
+    end
+    if (reset) begin
+      clock_cnt <= 5'h0;
+    end else begin
+      if (_T_212) begin
+        clock_cnt <= 5'h0;
+      end else begin
+        clock_cnt <= _T_216;
+      end
+    end
+    if (reset) begin
+      data_cnt <= 6'h0;
+    end else begin
+      if (_T_259) begin
+        data_cnt <= 6'h0;
+      end else begin
+        if (_T_269) begin
+          data_cnt <= 6'h0;
+        end else begin
+          if (_T_277) begin
+            data_cnt <= 6'h0;
+          end else begin
+            if (_T_297) begin
+              data_cnt <= _T_300;
+            end
+          end
+        end
+      end
+    end
+    if (reset) begin
+      pending_data <= 1'h0;
+    end else begin
+      if (_T_121) begin
+        pending_data <= 1'h1;
+      end else begin
+        if (_T_174) begin
+          pending_data <= 1'h0;
+        end
+      end
+    end
+    if (reset) begin
+      n_status <= 3'h0;
+    end else begin
+      if (_T_211) begin
+        if (pending_data) begin
+          n_status <= 3'h1;
+        end else begin
+          n_status <= 3'h0;
+        end
+      end else begin
+        if (_T_174) begin
+          n_status <= 3'h2;
+        end else begin
+          if (_T_229) begin
+            if (_T_234) begin
+              n_status <= 3'h3;
+            end else begin
+              n_status <= 3'h2;
+            end
+          end else begin
+            if (_T_188) begin
+              if (_T_242) begin
+                n_status <= 3'h4;
+              end else begin
+                n_status <= 3'h3;
+              end
+            end else begin
+              if (_T_243) begin
+                if (_T_190) begin
+                  n_status <= 3'h5;
+                end
+              end else begin
+                if (_T_247) begin
+                  if (_T_252) begin
+                    n_status <= 3'h0;
+                  end else begin
+                    n_status <= 3'h5;
+                  end
+                end else begin
+                  n_status <= 3'h0;
+                end
+              end
+            end
+          end
+        end
+      end
+    end
+    if (reset) begin
+      p_status <= 3'h0;
+    end else begin
+      p_status <= n_status;
+    end
+    if (reset) begin
+      wait_one_tick_done <= 1'h0;
+    end else begin
+      wait_one_tick_done <= 1'h1;
+    end
+  end
+endmodule