| #include "top.h" |
| |
| #include <systemc.h> |
| |
| sc_top::sc_top(sc_core::sc_module_name name) |
| : clock("clock"), core("core_mini_axi") { |
| core.io_aclk(clock); |
| core.io_aresetn(resetn); |
| core.io_halted(halted); |
| core.io_fault(fault); |
| core.io_wfi(wfi); |
| core.io_irq(irq); |
| core.io_te(te); |
| |
| core.io_slog_valid(slog.valid); |
| core.io_slog_addr(slog.addr); |
| core.io_slog_data(slog.data); |
| core.io_debug_en(debug.en); |
| core.io_debug_cycles(debug.cycles); |
| core.io_debug_addr_0(debug.addr_0); |
| core.io_debug_addr_1(debug.addr_1); |
| core.io_debug_addr_2(debug.addr_2); |
| core.io_debug_addr_3(debug.addr_3); |
| core.io_debug_inst_0(debug.inst_0); |
| core.io_debug_inst_1(debug.inst_1); |
| core.io_debug_inst_2(debug.inst_2); |
| core.io_debug_inst_3(debug.inst_3); |
| core.io_debug_dbus_valid(debug.dbus_valid); |
| core.io_debug_dbus_bits_addr(debug.dbus_bits_addr); |
| core.io_debug_dbus_bits_wdata(debug.dbus_bits_wdata); |
| core.io_debug_dbus_bits_write(debug.dbus_bits_write); |
| core.io_debug_dispatch_0_instFire(debug.dispatch_0_instFire); |
| core.io_debug_dispatch_1_instFire(debug.dispatch_1_instFire); |
| core.io_debug_dispatch_2_instFire(debug.dispatch_2_instFire); |
| core.io_debug_dispatch_3_instFire(debug.dispatch_3_instFire); |
| core.io_debug_dispatch_0_instAddr(debug.dispatch_0_instAddr); |
| core.io_debug_dispatch_1_instAddr(debug.dispatch_1_instAddr); |
| core.io_debug_dispatch_2_instAddr(debug.dispatch_2_instAddr); |
| core.io_debug_dispatch_3_instAddr(debug.dispatch_3_instAddr); |
| core.io_debug_dispatch_0_instInst(debug.dispatch_0_instInst); |
| core.io_debug_dispatch_1_instInst(debug.dispatch_1_instInst); |
| core.io_debug_dispatch_2_instInst(debug.dispatch_2_instInst); |
| core.io_debug_dispatch_3_instInst(debug.dispatch_3_instInst); |
| core.io_debug_regfile_writeAddr_0_valid(debug.regfile_writeAddr_0_valid); |
| core.io_debug_regfile_writeAddr_1_valid(debug.regfile_writeAddr_1_valid); |
| core.io_debug_regfile_writeAddr_2_valid(debug.regfile_writeAddr_2_valid); |
| core.io_debug_regfile_writeAddr_3_valid(debug.regfile_writeAddr_3_valid); |
| core.io_debug_regfile_writeAddr_0_bits(debug.regfile_writeAddr_0_bits); |
| core.io_debug_regfile_writeAddr_1_bits(debug.regfile_writeAddr_1_bits); |
| core.io_debug_regfile_writeAddr_2_bits(debug.regfile_writeAddr_2_bits); |
| core.io_debug_regfile_writeAddr_3_bits(debug.regfile_writeAddr_3_bits); |
| core.io_debug_regfile_writeData_0_valid(debug.regfile_writeData_0_valid); |
| core.io_debug_regfile_writeData_1_valid(debug.regfile_writeData_1_valid); |
| core.io_debug_regfile_writeData_2_valid(debug.regfile_writeData_2_valid); |
| core.io_debug_regfile_writeData_3_valid(debug.regfile_writeData_3_valid); |
| core.io_debug_regfile_writeData_4_valid(debug.regfile_writeData_4_valid); |
| core.io_debug_regfile_writeData_5_valid(debug.regfile_writeData_5_valid); |
| core.io_debug_regfile_writeData_0_bits_addr(debug.regfile_writeData_0_bits_addr); |
| core.io_debug_regfile_writeData_1_bits_addr(debug.regfile_writeData_1_bits_addr); |
| core.io_debug_regfile_writeData_2_bits_addr(debug.regfile_writeData_2_bits_addr); |
| core.io_debug_regfile_writeData_3_bits_addr(debug.regfile_writeData_3_bits_addr); |
| core.io_debug_regfile_writeData_4_bits_addr(debug.regfile_writeData_4_bits_addr); |
| core.io_debug_regfile_writeData_5_bits_addr(debug.regfile_writeData_5_bits_addr); |
| core.io_debug_regfile_writeData_0_bits_data(debug.regfile_writeData_0_bits_data); |
| core.io_debug_regfile_writeData_1_bits_data(debug.regfile_writeData_1_bits_data); |
| core.io_debug_regfile_writeData_2_bits_data(debug.regfile_writeData_2_bits_data); |
| core.io_debug_regfile_writeData_3_bits_data(debug.regfile_writeData_3_bits_data); |
| core.io_debug_regfile_writeData_4_bits_data(debug.regfile_writeData_4_bits_data); |
| core.io_debug_regfile_writeData_5_bits_data(debug.regfile_writeData_5_bits_data); |
| #if (KP_enableFloat == true) |
| core.io_debug_float_writeAddr_valid(debug.float_writeAddr_valid); |
| core.io_debug_float_writeAddr_bits(debug.float_writeAddr_bits); |
| core.io_debug_float_writeData_0_valid(debug.float_writeData_0_valid); |
| core.io_debug_float_writeData_1_valid(debug.float_writeData_1_valid); |
| core.io_debug_float_writeData_0_bits_addr(debug.float_writeData_0_bits_addr); |
| core.io_debug_float_writeData_1_bits_addr(debug.float_writeData_1_bits_addr); |
| core.io_debug_float_writeData_0_bits_data(debug.float_writeData_0_bits_data); |
| core.io_debug_float_writeData_1_bits_data(debug.float_writeData_1_bits_data); |
| #endif |
| core.io_dm_req_valid(dm.req_valid); |
| core.io_dm_req_ready(dm.req_valid); |
| core.io_dm_req_bits_address(dm.req_bits_address); |
| core.io_dm_req_bits_data(dm.req_bits_data); |
| core.io_dm_req_bits_op(dm.req_bits_op); |
| core.io_dm_rsp_valid(dm.rsp_valid); |
| core.io_dm_rsp_ready(dm.rsp_valid); |
| core.io_dm_rsp_bits_data(dm.rsp_bits_data); |
| core.io_dm_rsp_bits_op(dm.rsp_bits_op); |
| // AR |
| core.io_axi_master_read_addr_ready(master_arready_4); |
| core.io_axi_master_read_addr_valid(master_arvalid_4); |
| core.io_axi_master_read_addr_bits_addr(master_araddr_4); |
| core.io_axi_master_read_addr_bits_prot(master_arprot_4); |
| core.io_axi_master_read_addr_bits_id(master_arid_4); |
| core.io_axi_master_read_addr_bits_len(master_arlen_4); |
| core.io_axi_master_read_addr_bits_size(master_arsize_4); |
| core.io_axi_master_read_addr_bits_burst(master_arburst_4); |
| core.io_axi_master_read_addr_bits_lock(master_arlock_4); |
| core.io_axi_master_read_addr_bits_cache(master_arcache_4); |
| core.io_axi_master_read_addr_bits_qos(master_arqos_4); |
| core.io_axi_master_read_addr_bits_region(master_arregion_4); |
| // B |
| core.io_axi_master_read_data_ready(master_rready_4); |
| core.io_axi_master_read_data_valid(master_rvalid_4); |
| core.io_axi_master_read_data_bits_data(master_rdata_4); |
| core.io_axi_master_read_data_bits_id(master_rid_4); |
| core.io_axi_master_read_data_bits_resp(master_rresp_4); |
| core.io_axi_master_read_data_bits_last(master_rlast_4); |
| // AW |
| core.io_axi_master_write_addr_ready(master_awready_4); |
| core.io_axi_master_write_addr_valid(master_awvalid_4); |
| core.io_axi_master_write_addr_bits_addr(master_awaddr_4); |
| core.io_axi_master_write_addr_bits_prot(master_awprot_4); |
| core.io_axi_master_write_addr_bits_id(master_awid_4); |
| core.io_axi_master_write_addr_bits_len(master_awlen_4); |
| core.io_axi_master_write_addr_bits_size(master_awsize_4); |
| core.io_axi_master_write_addr_bits_burst(master_awburst_4); |
| core.io_axi_master_write_addr_bits_lock(master_awlock_4); |
| core.io_axi_master_write_addr_bits_cache(master_awcache_4); |
| core.io_axi_master_write_addr_bits_qos(master_awqos_4); |
| core.io_axi_master_write_addr_bits_region(master_awregion_4); |
| // W |
| core.io_axi_master_write_data_ready(master_wready_4); |
| core.io_axi_master_write_data_valid(master_wvalid_4); |
| core.io_axi_master_write_data_bits_data(master_wdata_4); |
| core.io_axi_master_write_data_bits_last(master_wlast_4); |
| core.io_axi_master_write_data_bits_strb(master_wstrb_4); |
| // B |
| core.io_axi_master_write_resp_ready(master_bready_4); |
| core.io_axi_master_write_resp_valid(master_bvalid_4); |
| core.io_axi_master_write_resp_bits_id(master_bid_4); |
| core.io_axi_master_write_resp_bits_resp(master_bresp_4); |
| |
| // AR |
| core.io_axi_slave_read_addr_ready(slave_arready_4); |
| core.io_axi_slave_read_addr_valid(slave_arvalid_4); |
| core.io_axi_slave_read_addr_bits_addr(slave_araddr_4); |
| core.io_axi_slave_read_addr_bits_prot(slave_arprot_4); |
| core.io_axi_slave_read_addr_bits_id(slave_arid_4); |
| core.io_axi_slave_read_addr_bits_len(slave_arlen_4); |
| core.io_axi_slave_read_addr_bits_size(slave_arsize_4); |
| core.io_axi_slave_read_addr_bits_burst(slave_arburst_4); |
| core.io_axi_slave_read_addr_bits_lock(slave_arlock_4); |
| core.io_axi_slave_read_addr_bits_cache(slave_arcache_4); |
| core.io_axi_slave_read_addr_bits_qos(slave_arqos_4); |
| core.io_axi_slave_read_addr_bits_region(slave_arregion_4); |
| // R |
| core.io_axi_slave_read_data_ready(slave_rready_4); |
| core.io_axi_slave_read_data_valid(slave_rvalid_4); |
| core.io_axi_slave_read_data_bits_data(slave_rdata_4); |
| core.io_axi_slave_read_data_bits_id(slave_rid_4); |
| core.io_axi_slave_read_data_bits_resp(slave_rresp_4); |
| core.io_axi_slave_read_data_bits_last(slave_rlast_4); |
| // AW |
| core.io_axi_slave_write_addr_ready(slave_awready_4); |
| core.io_axi_slave_write_addr_valid(slave_awvalid_4); |
| core.io_axi_slave_write_addr_bits_addr(slave_awaddr_4); |
| core.io_axi_slave_write_addr_bits_prot(slave_awprot_4); |
| core.io_axi_slave_write_addr_bits_id(slave_awid_4); |
| core.io_axi_slave_write_addr_bits_len(slave_awlen_4); |
| core.io_axi_slave_write_addr_bits_size(slave_awsize_4); |
| core.io_axi_slave_write_addr_bits_burst(slave_awburst_4); |
| core.io_axi_slave_write_addr_bits_lock(slave_awlock_4); |
| core.io_axi_slave_write_addr_bits_cache(slave_awcache_4); |
| core.io_axi_slave_write_addr_bits_qos(slave_awqos_4); |
| core.io_axi_slave_write_addr_bits_region(slave_awregion_4); |
| // W |
| core.io_axi_slave_write_data_ready(slave_wready_4); |
| core.io_axi_slave_write_data_valid(slave_wvalid_4); |
| core.io_axi_slave_write_data_bits_data(slave_wdata_4); |
| core.io_axi_slave_write_data_bits_last(slave_wlast_4); |
| core.io_axi_slave_write_data_bits_strb(slave_wstrb_4); |
| // B |
| core.io_axi_slave_write_resp_ready(slave_bready_4); |
| core.io_axi_slave_write_resp_valid(slave_bvalid_4); |
| core.io_axi_slave_write_resp_bits_id(slave_bid_4); |
| core.io_axi_slave_write_resp_bits_resp(slave_bresp_4); |
| |
| SC_METHOD(negedge); |
| sensitive << clock.neg(); |
| } |
| |
| void sc_top::start_of_simulation() { |
| resetn = 0; |
| te = 0; |
| irq = sc_dt::Log_0; |
| } |
| |
| void sc_top::negedge() { |
| if (hdl_elaboration_only()) { |
| return; |
| } |
| |
| // Check for halt/fault, and if either are seen |
| // report the state and stop the simulation. |
| bool faulted = false; |
| bool halt = false; |
| if (halted.read().is_01() && halted.read().to_bool()) { |
| if (fault.read().is_01() && fault.read().to_bool()) { |
| faulted = true; |
| } else { |
| halt = true; |
| } |
| } |
| |
| // Generate a reset pulse in the first few cycles. |
| static int edge_count = 0; |
| if (edge_count == 1) { |
| resetn = 1; |
| } |
| if (edge_count == 3) { |
| resetn = 0; |
| } else if (edge_count == 5) { |
| resetn = 1; |
| } |
| if (edge_count <= 5) { |
| edge_count++; |
| return; |
| } |
| |
| bool tohost_halt = false; |
| if (tohost_addr_.has_value()) { |
| sc_logic dbus_valid = debug.dbus_valid.read(); |
| if (dbus_valid.is_01() && dbus_valid.to_bool()) { |
| sc_lv<32> dbus_addr = debug.dbus_bits_addr.read(); |
| if (dbus_addr.get_word(0) == tohost_addr_.value()) { |
| sc_lv<128> dbus_wdata = debug.dbus_bits_wdata.read(); |
| if (dbus_wdata.get_word(0) & 1) { |
| tohost_halt = true; |
| } |
| } |
| } |
| } |
| |
| if (instr_trace_) { |
| TraceInstructions(); |
| } |
| |
| if (tohost_halt || halt || faulted) { |
| if (instr_trace_) { |
| tracer_.PrintTrace(); |
| } |
| } |
| |
| if (tohost_halt) { |
| printf("DUT requested halt.\n"); |
| sc_stop(); |
| } |
| |
| if (halt) { |
| if (faulted) { |
| printf("Fault detected, halting.\n"); |
| } else { |
| printf("Halted successfully (via mpause).\n"); |
| } |
| sc_stop(); |
| } |
| |
| // The below sections move data between the SystemC world |
| // and RTL world, and convert between 2-state and 4-state |
| // logic. |
| |
| // S - R |
| tli_set_logic(sc_logic(slave_rready), |
| "top.core_mini_axi.io_axi_slave_read_data_ready"); |
| if (slave_rvalid_4.read().is_01()) { |
| slave_rvalid = slave_rvalid_4.read().to_bool(); |
| } |
| if (slave_rdata_4.read().is_01()) { |
| slave_rdata = slave_rdata_4.read(); |
| } |
| if (slave_rid_4.read().is_01()) { |
| slave_rid = slave_rid_4.read(); |
| } |
| if (slave_rresp_4.read().is_01()) { |
| slave_rresp = slave_rresp_4.read(); |
| } |
| if (slave_rlast_4.read().is_01()) { |
| slave_rlast = slave_rlast_4.read().to_bool(); |
| } |
| |
| // S - AR |
| if (slave_arready_4.read().is_01()) { |
| slave_arready = slave_arready_4.read().to_bool(); |
| } |
| tli_set_logic(sc_logic(slave_arvalid), |
| "top.core_mini_axi.io_axi_slave_read_addr_valid"); |
| tli_set_lv(sc_lv<32>(slave_araddr.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_addr"); |
| tli_set_lv(sc_lv<3>(slave_arprot.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_prot"); |
| tli_set_lv(sc_lv<6>(slave_arid.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_id"); |
| tli_set_lv(sc_lv<8>(slave_arlen.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_len"); |
| tli_set_lv(sc_lv<3>(slave_arsize.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_size"); |
| tli_set_lv(sc_lv<2>(slave_arburst.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_burst"); |
| tli_set_logic(sc_logic(slave_arlock), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_lock"); |
| tli_set_lv(sc_lv<4>(slave_arcache.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_cache"); |
| tli_set_lv(sc_lv<4>(slave_arqos.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_qos"); |
| tli_set_lv(sc_lv<4>(slave_arregion.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_read_addr_bits_region"); |
| |
| // S - AW |
| if (slave_awready_4.read().is_01()) { |
| slave_awready = slave_awready_4.read().to_bool(); |
| } |
| tli_set_logic(sc_logic(slave_awvalid), |
| "top.core_mini_axi.io_axi_slave_write_addr_valid"); |
| tli_set_lv(sc_lv<32>(slave_awaddr.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_addr"); |
| tli_set_lv(sc_lv<3>(slave_awprot.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_prot"); |
| tli_set_lv(sc_lv<6>(slave_awid.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_id"); |
| tli_set_lv(sc_lv<8>(slave_awlen.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_len"); |
| tli_set_lv(sc_lv<3>(slave_awsize.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_size"); |
| tli_set_lv(sc_lv<2>(slave_awburst.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_burst"); |
| tli_set_logic(sc_logic(slave_awlock), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_lock"); |
| tli_set_lv(sc_lv<4>(slave_awcache.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_cache"); |
| tli_set_lv(sc_lv<4>(slave_awqos.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_qos"); |
| tli_set_lv(sc_lv<4>(slave_awregion.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_addr_bits_region"); |
| |
| // S - B |
| tli_set_logic(sc_logic(slave_bready), |
| "top.core_mini_axi.io_axi_slave_write_resp_ready"); |
| if (slave_bvalid_4.read().is_01()) { |
| slave_bvalid = slave_bvalid_4.read().to_bool(); |
| } |
| if (slave_bid_4.read().is_01()) { |
| slave_bid = slave_bid_4.read(); |
| } |
| if (slave_bresp_4.read().is_01()) { |
| slave_bresp = slave_bresp_4.read(); |
| } |
| |
| // S - W |
| if (slave_wready_4.read().is_01()) { |
| slave_wready = slave_wready_4.read().to_bool(); |
| } |
| tli_set_logic(sc_logic(slave_wvalid), |
| "top.core_mini_axi.io_axi_slave_write_data_valid"); |
| tli_set_lv(sc_lv<128>(slave_wdata.read()), |
| "top.core_mini_axi.io_axi_slave_write_data_bits_data"); |
| tli_set_lv(sc_lv<16>(slave_wstrb.read().get_word(0)), |
| "top.core_mini_axi.io_axi_slave_write_data_bits_strb"); |
| tli_set_logic(sc_logic(slave_wlast), |
| "top.core_mini_axi.io_axi_slave_write_data_bits_last"); |
| |
| // M - B |
| tli_set_logic(sc_logic(master_bvalid), |
| "top.core_mini_axi.io_axi_master_write_resp_valid"); |
| tli_set_lv(sc_lv<6>(master_bid.read()), |
| "top.core_mini_axi.io_axi_master_write_resp_bits_id"); |
| tli_set_lv(sc_lv<2>(master_bresp.read()), |
| "top.core_mini_axi.io_axi_master_write_resp_bits_resp"); |
| if (master_bready_4.read().is_01()) { |
| master_bready = master_bready_4.read().to_bool(); |
| } |
| |
| // M - W |
| tli_set_logic(sc_logic(master_wready), |
| "top.core_mini_axi.io_axi_master_write_data_ready"); |
| if (master_wvalid_4.read().is_01()) { |
| master_wvalid = master_wvalid_4.read().to_bool(); |
| } |
| if (master_wdata_4.read().is_01()) { |
| master_wdata = master_wdata_4.read(); |
| } |
| if (master_wstrb_4.read().is_01()) { |
| master_wstrb = master_wstrb_4.read(); |
| } |
| if (master_wlast_4.read().is_01()) { |
| master_wlast = master_wlast_4.read().to_bool(); |
| } |
| |
| // M - AW |
| if (master_awvalid_4.read().is_01()) { |
| master_awvalid = master_awvalid_4.read().to_bool(); |
| } |
| tli_set_logic(sc_logic(master_awready), |
| "top.core_mini_axi.io_axi_master_write_addr_ready"); |
| if (master_awaddr_4.read().is_01()) { |
| master_awaddr = master_awaddr_4.read(); |
| } |
| if (master_awprot_4.read().is_01()) { |
| master_awprot = master_awprot_4.read(); |
| } |
| if (master_awid_4.read().is_01()) { |
| master_awid = master_awid_4.read(); |
| } |
| if (master_awlen_4.read().is_01()) { |
| master_awlen = master_awlen_4.read(); |
| } |
| if (master_awsize_4.read().is_01()) { |
| master_awsize = master_awsize_4.read(); |
| } |
| if (master_awburst_4.read().is_01()) { |
| master_awburst = master_awburst_4.read(); |
| } |
| if (master_awlock_4.read().is_01()) { |
| master_awlock = master_awlock_4.read().to_bool(); |
| } |
| if (master_awcache_4.read().is_01()) { |
| master_awcache = master_awcache_4.read(); |
| } |
| if (master_awqos_4.read().is_01()) { |
| master_awqos = master_awqos_4.read(); |
| } |
| if (master_awregion_4.read().is_01()) { |
| master_awregion = master_awregion_4.read(); |
| } |
| |
| // M - AR |
| if (master_arvalid_4.read().is_01()) { |
| master_arvalid = master_arvalid_4.read().to_bool(); |
| } |
| tli_set_logic(sc_logic(master_arready), |
| "top.core_mini_axi.io_axi_master_read_addr_ready"); |
| if (master_araddr_4.read().is_01()) { |
| master_araddr = master_araddr_4.read(); |
| } |
| if (master_arprot_4.read().is_01()) { |
| master_arprot = master_arprot_4.read(); |
| } |
| if (master_arid_4.read().is_01()) { |
| master_arid = master_arid_4.read(); |
| } |
| if (master_arlen_4.read().is_01()) { |
| master_arlen = master_arlen_4.read(); |
| } |
| if (master_arsize_4.read().is_01()) { |
| master_arsize = master_arsize_4.read(); |
| } |
| if (master_arburst_4.read().is_01()) { |
| master_arburst = master_arburst_4.read(); |
| } |
| if (master_arlock_4.read().is_01()) { |
| master_arlock = master_arlock_4.read().to_bool(); |
| } |
| if (master_arcache_4.read().is_01()) { |
| master_arcache = master_arcache_4.read(); |
| } |
| if (master_arqos_4.read().is_01()) { |
| master_arqos = master_arqos_4.read(); |
| } |
| if (master_arregion_4.read().is_01()) { |
| master_arregion = master_arregion_4.read(); |
| } |
| |
| // M - R |
| tli_set_logic(sc_logic(master_rvalid), |
| "top.core_mini_axi.io_axi_master_read_data_valid"); |
| if (master_rready_4.read().is_01()) { |
| master_rready = master_rready_4.read().to_bool(); |
| } |
| tli_set_lv(sc_lv<128>(master_rdata.read()), |
| "top.core_mini_axi.io_axi_master_read_data_bits_data"); |
| tli_set_lv(sc_lv<6>(master_rid.read().get_word(0)), |
| "top.core_mini_axi.io_axi_master_read_data_bits_id"); |
| tli_set_lv(sc_lv<2>(master_rresp.read().get_word(0)), |
| "top.core_mini_axi.io_axi_master_read_data_bits_resp"); |
| tli_set_logic(sc_logic(master_rlast.read()), |
| "top.core_mini_axi.io_axi_master_read_data_bits_last"); |
| |
| // Generate an IRQ when we see that the core is in WFI. |
| static bool wfi_seen = false; |
| if (wfi.read().is_01() && wfi.read().to_bool() && !wfi_seen) { |
| irq = sc_dt::Log_1; |
| wfi_seen = true; |
| } else if (wfi.read().is_01() && !wfi.read().to_bool() && wfi_seen) { |
| irq = sc_dt::Log_0; |
| wfi_seen = false; |
| } else { |
| irq = sc_dt::Log_0; |
| } |
| |
| edge_count++; |
| } |
| |
| void sc_top::TraceInstructions() { |
| std::vector<bool> instFires = { |
| debug.dispatch_0_instFire.read().is_01() && debug.dispatch_0_instFire.read().to_bool(), |
| debug.dispatch_1_instFire.read().is_01() && debug.dispatch_1_instFire.read().to_bool(), |
| debug.dispatch_2_instFire.read().is_01() && debug.dispatch_2_instFire.read().to_bool(), |
| debug.dispatch_3_instFire.read().is_01() && debug.dispatch_3_instFire.read().to_bool() |
| }; |
| std::vector<uint32_t> instAddrs = { |
| debug.dispatch_0_instAddr.read().is_01() ? debug.dispatch_0_instAddr.read().get_word(0) : 0, |
| debug.dispatch_1_instAddr.read().is_01() ? debug.dispatch_1_instAddr.read().get_word(0) : 0, |
| debug.dispatch_2_instAddr.read().is_01() ? debug.dispatch_2_instAddr.read().get_word(0) : 0, |
| debug.dispatch_3_instAddr.read().is_01() ? debug.dispatch_3_instAddr.read().get_word(0) : 0, |
| }; |
| std::vector<uint32_t> instInsts = { |
| debug.dispatch_0_instInst.read().is_01() ? debug.dispatch_0_instInst.read().get_word(0) : 0, |
| debug.dispatch_1_instInst.read().is_01() ? debug.dispatch_1_instInst.read().get_word(0) : 0, |
| debug.dispatch_2_instInst.read().is_01() ? debug.dispatch_2_instInst.read().get_word(0) : 0, |
| debug.dispatch_3_instInst.read().is_01() ? debug.dispatch_3_instInst.read().get_word(0) : 0 |
| }; |
| |
| std::vector<bool> scalarWriteAddrValids = { |
| debug.regfile_writeAddr_0_valid.read().is_01() && debug.regfile_writeAddr_0_valid.read().to_bool(), |
| debug.regfile_writeAddr_1_valid.read().is_01() && debug.regfile_writeAddr_1_valid.read().to_bool(), |
| debug.regfile_writeAddr_2_valid.read().is_01() && debug.regfile_writeAddr_2_valid.read().to_bool(), |
| debug.regfile_writeAddr_3_valid.read().is_01() && debug.regfile_writeAddr_3_valid.read().to_bool() |
| }; |
| std::vector<uint32_t> scalarWriteAddrAddrs = { |
| debug.regfile_writeAddr_0_bits.read().is_01() ? debug.regfile_writeAddr_0_bits.read().get_word(0) : 0, |
| debug.regfile_writeAddr_1_bits.read().is_01() ? debug.regfile_writeAddr_1_bits.read().get_word(0) : 0, |
| debug.regfile_writeAddr_2_bits.read().is_01() ? debug.regfile_writeAddr_2_bits.read().get_word(0) : 0, |
| debug.regfile_writeAddr_3_bits.read().is_01() ? debug.regfile_writeAddr_3_bits.read().get_word(0) : 0 |
| }; |
| std::vector<bool> floatWriteAddrValids = { |
| debug.float_writeAddr_valid.read().is_01() && debug.float_writeAddr_valid.read().to_bool() |
| }; |
| std::vector<uint32_t> floatWriteAddrAddrs = { |
| debug.float_writeAddr_bits.read().is_01() ? debug.float_writeAddr_bits.read().get_word(0) : 0 |
| }; |
| |
| std::vector<bool> writeDataValids = { |
| debug.regfile_writeData_0_valid.read().is_01() && debug.regfile_writeData_0_valid.read().to_bool(), |
| debug.regfile_writeData_1_valid.read().is_01() && debug.regfile_writeData_1_valid.read().to_bool(), |
| debug.regfile_writeData_2_valid.read().is_01() && debug.regfile_writeData_2_valid.read().to_bool(), |
| debug.regfile_writeData_3_valid.read().is_01() && debug.regfile_writeData_3_valid.read().to_bool(), |
| debug.regfile_writeData_4_valid.read().is_01() && debug.regfile_writeData_4_valid.read().to_bool(), |
| debug.regfile_writeData_5_valid.read().is_01() && debug.regfile_writeData_5_valid.read().to_bool(), |
| debug.float_writeData_0_valid.read().is_01() && debug.float_writeData_0_valid.read().to_bool(), |
| debug.float_writeData_1_valid.read().is_01() && debug.float_writeData_1_valid.read().to_bool(), |
| }; |
| |
| std::vector<uint32_t> writeDataAddrs = { |
| debug.regfile_writeData_0_bits_addr.read().is_01() ? debug.regfile_writeData_0_bits_addr.read().get_word(0) : 0, |
| debug.regfile_writeData_1_bits_addr.read().is_01() ? debug.regfile_writeData_1_bits_addr.read().get_word(0) : 0, |
| debug.regfile_writeData_2_bits_addr.read().is_01() ? debug.regfile_writeData_2_bits_addr.read().get_word(0) : 0, |
| debug.regfile_writeData_3_bits_addr.read().is_01() ? debug.regfile_writeData_3_bits_addr.read().get_word(0) : 0, |
| debug.regfile_writeData_4_bits_addr.read().is_01() ? debug.regfile_writeData_4_bits_addr.read().get_word(0) : 0, |
| debug.regfile_writeData_5_bits_addr.read().is_01() ? debug.regfile_writeData_5_bits_addr.read().get_word(0) : 0, |
| debug.float_writeData_0_bits_addr.read().is_01() ? debug.float_writeData_0_bits_addr.read().get_word(0) : 0, |
| debug.float_writeData_1_bits_addr.read().is_01() ? debug.float_writeData_1_bits_addr.read().get_word(0) : 0 |
| }; |
| |
| std::vector<uint32_t> writeDataDatas = { |
| debug.regfile_writeData_0_bits_data.read().is_01() ? debug.regfile_writeData_0_bits_data.read().get_word(0) : 0, |
| debug.regfile_writeData_1_bits_data.read().is_01() ? debug.regfile_writeData_1_bits_data.read().get_word(0) : 0, |
| debug.regfile_writeData_2_bits_data.read().is_01() ? debug.regfile_writeData_2_bits_data.read().get_word(0) : 0, |
| debug.regfile_writeData_3_bits_data.read().is_01() ? debug.regfile_writeData_3_bits_data.read().get_word(0) : 0, |
| debug.regfile_writeData_4_bits_data.read().is_01() ? debug.regfile_writeData_4_bits_data.read().get_word(0) : 0, |
| debug.regfile_writeData_5_bits_data.read().is_01() ? debug.regfile_writeData_5_bits_data.read().get_word(0) : 0, |
| debug.float_writeData_0_bits_data.read().is_01() ? debug.float_writeData_0_bits_data.read().get_word(0) : 0, |
| debug.float_writeData_1_bits_data.read().is_01() ? debug.float_writeData_1_bits_data.read().get_word(0) : 0 |
| }; |
| |
| std::vector<int> executeRegBases = { |
| InstructionTrace::kScalarBaseReg, |
| InstructionTrace::kScalarBaseReg, |
| InstructionTrace::kScalarBaseReg, |
| InstructionTrace::kScalarBaseReg, |
| InstructionTrace::kScalarBaseReg, |
| InstructionTrace::kScalarBaseReg, |
| InstructionTrace::kFloatBaseReg, |
| InstructionTrace::kFloatBaseReg |
| }; |
| |
| tracer_.TraceInstruction( |
| instFires, |
| instAddrs, |
| instInsts, |
| scalarWriteAddrValids, |
| scalarWriteAddrAddrs, |
| floatWriteAddrValids, |
| floatWriteAddrAddrs, |
| writeDataValids, |
| writeDataAddrs, |
| writeDataDatas, |
| executeRegBases |
| ); |
| } |