UnityChipVerification/rtl/TageSC/TageBTable.sv

189 lines
12 KiB
Systemverilog

// Generated by CIRCT firtool-1.62.0
// Standard header to adapt well known macros for register randomization.
`ifndef RANDOMIZE
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif // RANDOMIZE_MEM_INIT
`endif // not def RANDOMIZE
`ifndef RANDOMIZE
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif // RANDOMIZE_REG_INIT
`endif // not def RANDOMIZE
// RANDOM may be set to an expression that produces a 32-bit random unsigned value.
`ifndef RANDOM
`define RANDOM $random
`endif // not def RANDOM
// Users can define INIT_RANDOM as general code that gets injected into the
// initializer block for modules with registers.
`ifndef INIT_RANDOM
`define INIT_RANDOM
`endif // not def INIT_RANDOM
// If using random initialization, you can also define RANDOMIZE_DELAY to
// customize the delay used, otherwise 0.002 is used.
`ifndef RANDOMIZE_DELAY
`define RANDOMIZE_DELAY 0.002
`endif // not def RANDOMIZE_DELAY
// Define INIT_RANDOM_PROLOG_ for use in our modules below.
`ifndef INIT_RANDOM_PROLOG_
`ifdef RANDOMIZE
`ifdef VERILATOR
`define INIT_RANDOM_PROLOG_ `INIT_RANDOM
`else // VERILATOR
`define INIT_RANDOM_PROLOG_ `INIT_RANDOM #`RANDOMIZE_DELAY begin end
`endif // VERILATOR
`else // RANDOMIZE
`define INIT_RANDOM_PROLOG_
`endif // RANDOMIZE
`endif // not def INIT_RANDOM_PROLOG_
// Include register initializers in init blocks unless synthesis is set
`ifndef SYNTHESIS
`ifndef ENABLE_INITIAL_REG_
`define ENABLE_INITIAL_REG_
`endif // not def ENABLE_INITIAL_REG_
`endif // not def SYNTHESIS
// Include rmemory initializers in init blocks unless synthesis is set
`ifndef SYNTHESIS
`ifndef ENABLE_INITIAL_MEM_
`define ENABLE_INITIAL_MEM_
`endif // not def ENABLE_INITIAL_MEM_
`endif // not def SYNTHESIS
module TageBTable( // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
input clock, // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
input reset, // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
output io_req_ready, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input io_req_valid, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input [40:0] io_req_bits, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
output [1:0] io_s1_cnt_0, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
output [1:0] io_s1_cnt_1, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input io_update_mask_0, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input io_update_mask_1, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input [40:0] io_update_pc, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input [1:0] io_update_cnt_0, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input [1:0] io_update_cnt_1, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input io_update_takens_0, // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
input io_update_takens_1 // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
);
wire [1:0] newCtrs_1; // @[src/main/scala/xiangshan/frontend/Tage.scala:213:8]
wire [1:0] newCtrs_0; // @[src/main/scala/xiangshan/frontend/Tage.scala:213:8]
wire _wrbypass_io_hit; // @[src/main/scala/xiangshan/frontend/Tage.scala:192:24]
wire _wrbypass_io_hit_data_0_valid; // @[src/main/scala/xiangshan/frontend/Tage.scala:192:24]
wire [1:0] _wrbypass_io_hit_data_0_bits; // @[src/main/scala/xiangshan/frontend/Tage.scala:192:24]
wire _wrbypass_io_hit_data_1_valid; // @[src/main/scala/xiangshan/frontend/Tage.scala:192:24]
wire [1:0] _wrbypass_io_hit_data_1_bits; // @[src/main/scala/xiangshan/frontend/Tage.scala:192:24]
wire [1:0] _bt_io_r_resp_data_0; // @[src/main/scala/xiangshan/frontend/Tage.scala:154:18]
wire [1:0] _bt_io_r_resp_data_1; // @[src/main/scala/xiangshan/frontend/Tage.scala:154:18]
reg doing_reset; // @[src/main/scala/xiangshan/frontend/Tage.scala:166:28]
reg [10:0] resetRow; // @[src/main/scala/xiangshan/frontend/Tage.scala:167:25]
reg [10:0] s1_idx; // @[src/main/scala/xiangshan/frontend/Tage.scala:181:25]
wire _wrbypass_io_wen_T = io_update_mask_0 | io_update_mask_1; // @[src/main/scala/xiangshan/frontend/Tage.scala:193:45]
wire [1:0] oldCtrs_0 =
_wrbypass_io_hit
& (io_update_pc[1] ? _wrbypass_io_hit_data_1_valid : _wrbypass_io_hit_data_0_valid)
? (io_update_pc[1] ? _wrbypass_io_hit_data_1_bits : _wrbypass_io_hit_data_0_bits)
: io_update_pc[1] ? io_update_cnt_1 : io_update_cnt_0; // @[src/main/scala/xiangshan/frontend/Tage.scala:53:42, :192:24, :205:{10,27}]
wire [1:0] oldCtrs_1 =
_wrbypass_io_hit
& (io_update_pc[1] ? _wrbypass_io_hit_data_0_valid : _wrbypass_io_hit_data_1_valid)
? (io_update_pc[1] ? _wrbypass_io_hit_data_0_bits : _wrbypass_io_hit_data_1_bits)
: io_update_pc[1] ? io_update_cnt_0 : io_update_cnt_1; // @[src/main/scala/xiangshan/frontend/Tage.scala:53:42, :192:24, :205:{10,27}]
wire _GEN = io_update_pc[1] ? io_update_takens_1 : io_update_takens_0; // @[src/main/scala/xiangshan/frontend/Tage.scala:53:42, :213:21]
assign newCtrs_0 =
(&oldCtrs_0) & _GEN
? 2'h3
: oldCtrs_0 == 2'h0 & ~_GEN
? 2'h0
: _GEN ? 2'(oldCtrs_0 + 2'h1) : 2'(oldCtrs_0 - 2'h1); // @[src/main/scala/xiangshan/frontend/Tage.scala:205:10, :211:27, :212:30, :213:{8,21}, :214:{10,26,29}, :215:{12,24,35}, :234:36]
wire _GEN_0 = io_update_pc[1] ? io_update_takens_0 : io_update_takens_1; // @[src/main/scala/xiangshan/frontend/Tage.scala:53:42, :213:21]
assign newCtrs_1 =
(&oldCtrs_1) & _GEN_0
? 2'h3
: oldCtrs_1 == 2'h0 & ~_GEN_0
? 2'h0
: _GEN_0 ? 2'(oldCtrs_1 + 2'h1) : 2'(oldCtrs_1 - 2'h1); // @[src/main/scala/xiangshan/frontend/Tage.scala:205:10, :211:27, :212:30, :213:{8,21}, :214:{10,26,29}, :215:{12,24,35}, :234:36]
always @(posedge clock or posedge reset) begin // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
if (reset) begin // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
doing_reset <= 1'h1; // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7, :166:28]
resetRow <= 11'h0; // @[src/main/scala/xiangshan/frontend/Tage.scala:167:25]
end
else begin // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
doing_reset <= resetRow != 11'h7FF & doing_reset; // @[src/main/scala/xiangshan/frontend/Tage.scala:166:28, :167:25, :169:{18,36,50}]
resetRow <= 11'(resetRow + {10'h0, doing_reset}); // @[src/main/scala/xiangshan/frontend/Tage.scala:166:28, :167:25, :168:24]
end
end // always @(posedge, posedge)
always @(posedge clock) begin // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
if (io_req_valid) // @[src/main/scala/xiangshan/frontend/Tage.scala:138:14]
s1_idx <= io_req_bits[11:1]; // @[src/main/scala/xiangshan/frontend/FrontendBundle.scala:400:65, src/main/scala/xiangshan/frontend/Tage.scala:181:25]
end // always @(posedge)
`ifdef ENABLE_INITIAL_REG_ // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
`ifdef FIRRTL_BEFORE_INITIAL // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
`FIRRTL_BEFORE_INITIAL // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
`endif // FIRRTL_BEFORE_INITIAL
logic [31:0] _RANDOM[0:0]; // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
initial begin // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
`ifdef INIT_RANDOM_PROLOG_ // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
`INIT_RANDOM_PROLOG_ // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
`endif // INIT_RANDOM_PROLOG_
`ifdef RANDOMIZE_REG_INIT // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
_RANDOM[/*Zero width*/ 1'b0] = `RANDOM; // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
doing_reset = _RANDOM[/*Zero width*/ 1'b0][0]; // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7, :166:28]
resetRow = _RANDOM[/*Zero width*/ 1'b0][11:1]; // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7, :166:28, :167:25]
s1_idx = _RANDOM[/*Zero width*/ 1'b0][22:12]; // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7, :166:28, :181:25]
`endif // RANDOMIZE_REG_INIT
if (reset) begin // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
doing_reset = 1'h1; // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7, :166:28]
resetRow = 11'h0; // @[src/main/scala/xiangshan/frontend/Tage.scala:167:25]
end
end // initial
`ifdef FIRRTL_AFTER_INITIAL // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
`FIRRTL_AFTER_INITIAL // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7]
`endif // FIRRTL_AFTER_INITIAL
`endif // ENABLE_INITIAL_REG_
FoldedSRAMTemplate_20 bt ( // @[src/main/scala/xiangshan/frontend/Tage.scala:154:18]
.clock (clock),
.reset (reset),
.io_r_req_valid (io_req_valid),
.io_r_req_bits_setIdx (io_req_bits[11:1]), // @[src/main/scala/xiangshan/frontend/FrontendBundle.scala:400:65]
.io_r_resp_data_0 (_bt_io_r_resp_data_0),
.io_r_resp_data_1 (_bt_io_r_resp_data_1),
.io_w_req_valid (_wrbypass_io_wen_T | doing_reset), // @[src/main/scala/xiangshan/frontend/Tage.scala:166:28, :193:45, :231:41]
.io_w_req_bits_setIdx (doing_reset ? resetRow : io_update_pc[11:1]), // @[src/main/scala/xiangshan/frontend/FrontendBundle.scala:400:65, src/main/scala/xiangshan/frontend/Tage.scala:166:28, :167:25, :233:17]
.io_w_req_bits_data_0 (doing_reset ? 2'h2 : newCtrs_0), // @[src/main/scala/xiangshan/frontend/Tage.scala:166:28, :213:8, :232:{15,36}]
.io_w_req_bits_data_1 (doing_reset ? 2'h2 : newCtrs_1), // @[src/main/scala/xiangshan/frontend/Tage.scala:166:28, :213:8, :232:{15,36}]
.io_w_req_bits_waymask
(doing_reset
? 2'h3
: {io_update_mask_0 & io_update_pc[1] | io_update_mask_1 & ~(io_update_pc[1]),
io_update_mask_0 & ~(io_update_pc[1]) | io_update_mask_1 & io_update_pc[1]}) // @[src/main/scala/xiangshan/frontend/Tage.scala:53:42, :55:92, :166:28, :211:27, :226:{26,55}, :227:15, :228:6, :234:18]
);
WrBypass_32 wrbypass ( // @[src/main/scala/xiangshan/frontend/Tage.scala:192:24]
.clock (clock),
.reset (reset),
.io_wen (_wrbypass_io_wen_T), // @[src/main/scala/xiangshan/frontend/Tage.scala:193:45]
.io_write_idx (io_update_pc[11:1]), // @[src/main/scala/xiangshan/frontend/FrontendBundle.scala:400:65]
.io_write_data_0 (io_update_pc[1] ? newCtrs_1 : newCtrs_0), // @[src/main/scala/xiangshan/frontend/Tage.scala:53:42, :198:32, :213:8]
.io_write_data_1 (io_update_pc[1] ? newCtrs_0 : newCtrs_1), // @[src/main/scala/xiangshan/frontend/Tage.scala:53:42, :198:32, :213:8]
.io_write_way_mask_0 (io_update_mask_0),
.io_write_way_mask_1 (io_update_mask_1),
.io_hit (_wrbypass_io_hit),
.io_hit_data_0_valid (_wrbypass_io_hit_data_0_valid),
.io_hit_data_0_bits (_wrbypass_io_hit_data_0_bits),
.io_hit_data_1_valid (_wrbypass_io_hit_data_1_valid),
.io_hit_data_1_bits (_wrbypass_io_hit_data_1_bits)
);
assign io_req_ready = ~doing_reset; // @[src/main/scala/xiangshan/frontend/Tage.scala:137:7, :166:28, :172:19]
assign io_s1_cnt_0 =
(s1_idx[0] ? 2'h0 : _bt_io_r_resp_data_0) | (s1_idx[0] ? _bt_io_r_resp_data_1 : 2'h0); // @[src/main/scala/chisel3/util/Mux.scala:30:73, src/main/scala/xiangshan/frontend/Tage.scala:53:42, :137:7, :154:18, :181:25, :234:36]
assign io_s1_cnt_1 =
(s1_idx[0] ? _bt_io_r_resp_data_0 : 2'h0) | (s1_idx[0] ? 2'h0 : _bt_io_r_resp_data_1); // @[src/main/scala/chisel3/util/Mux.scala:30:73, src/main/scala/xiangshan/frontend/Tage.scala:53:42, :137:7, :154:18, :181:25, :234:36]
endmodule