38 sc_core::sc_vector<QemuTargetSignalSocket> irq_in;
41 cci::cci_param<uint64_t> p_hartid;
42 cci::cci_param<bool> p_debug;
43 cci::cci_param<bool> p_pmp;
44 cci::cci_param<bool> p_mmu;
45 cci::cci_param<std::string> p_priv_spec;
46 cci::cci_param<uint64_t> p_cbom_blocksize;
47 cci::cci_param<uint64_t> p_cbop_blocksize;
48 cci::cci_param<uint64_t> p_cboz_blocksize;
49 cci::cci_param<uint64_t> p_mvendorid;
50 cci::cci_param<uint64_t> p_mimpid;
51 cci::cci_param<uint64_t> p_marchid;
52 cci::cci_param<uint64_t> p_resetvec;
62 , irq_in(
"irq_in", 32)
64 , p_hartid(
"hartid",
hartid,
"Hardware thread ID")
65 , p_debug(
"debug",
true,
"Enable debug support")
66 , p_pmp(
"pmp",
false,
"Enable Physical Memory Protection")
67 , p_mmu(
"mmu",
true,
"Enable Memory Management Unit")
68 , p_priv_spec(
"priv_spec",
"v1.12.0",
"Privilege specification version")
69 , p_cbom_blocksize(
"cbom_blocksize", 64,
"Cache block management operation block size")
70 , p_cbop_blocksize(
"cbop_blocksize", 64,
"Cache block prefetch operation block size")
71 , p_cboz_blocksize(
"cboz_blocksize", 64,
"Cache block zero operation block size")
72 , p_mvendorid(
"mvendorid", 0,
"Vendor ID")
73 , p_mimpid(
"mimpid", 0,
"Implementation ID")
74 , p_marchid(
"marchid", 0,
"Architecture ID")
75 , p_resetvec(
"resetvec", 0x0,
"Reset vector address")
77 m_external_ev |= m_irq_ev;
78 for (
auto& irq : irq_in) {
79 m_external_ev |= irq->default_event();
83 void before_end_of_elaboration()
85 QemuCpu::before_end_of_elaboration();
88 cpu.set_prop_int(
"hartid", p_hartid);
91 cpu.set_prop_int(
"resetvec", p_resetvec);
92 cpu.set_prop_bool(
"debug", p_debug);
93 cpu.set_prop_bool(
"pmp", p_pmp);
94 cpu.set_prop_bool(
"mmu", p_mmu);
95 cpu.set_prop_str(
"priv_spec", p_priv_spec.get_value().c_str());
98 cpu.set_prop_int(
"cbom_blocksize", p_cbom_blocksize);
99 cpu.set_prop_int(
"cbop_blocksize", p_cbop_blocksize);
100 cpu.set_prop_int(
"cboz_blocksize", p_cboz_blocksize);
103 cpu.set_prop_int(
"mvendorid", p_mvendorid);
104 cpu.set_prop_int(
"mimpid", p_mimpid);
105 cpu.set_prop_int(
"marchid", p_marchid);
107 cpu.set_mip_update_callback(std::bind(&QemuCpuRiscv32::mip_update_cb,
this, std::placeholders::_1));
110 void end_of_elaboration()
override
112 QemuCpu::end_of_elaboration();
115 for (
int i = 0;
i < 32;
i++) {
116 irq_in[
i].init(m_dev,
i);
121 cpu.register_reset();