blob: 8bfd3a79c32ceaa865e87deeac1eb21829cecfaa [file] [log] [blame]
#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);
// 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(posedge);
sensitive << clock.pos();
}
void sc_top::start_of_simulation() {
resetn = 1;
te = 0;
irq = sc_dt::Log_0;
}
void sc_top::posedge() {
if (hdl_elaboration_only()) {
return;
}
// Check for halt/fault, and if either are seen
// report the state and stop the simulation.
if (halted.read().is_01() && halted.read().to_bool()) {
if (fault.read().is_01() && fault.read().to_bool()) {
printf("Fault detected, halting.\n");
} else {
printf("Halted successfully.\n");
}
sc_stop();
}
// Generate a reset pulse in the first few cycles.
static int edge_count = 0;
if (edge_count == 3) {
resetn = 0;
} else if (edge_count == 5) {
resetn = 1;
}
if (edge_count <= 5) {
edge_count++;
return;
}
// 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_lv(sc_lv<2>(slave_arlock.read().get_word(0)),
"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_lv(sc_lv<2>(slave_awlock.read().get_word(0)),
"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();
}
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();
}
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++;
}