Skip to content

Commit 1b61868

Browse files
committed
hw: verilator: register DRAM memory area for loading on commandline
the memory can be loaded into using the existing -E flags, or -r and -m can be used to load into ROM/SRAM or DRAM respectively. Signed-off-by: Alice Ziuziakowska <a.ziuziakowska@lowrisc.org>
1 parent 4df036f commit 1b61868

File tree

3 files changed

+64
-14
lines changed

3 files changed

+64
-14
lines changed

hw/top_chip/dv/verilator/top_chip_verilator.cc

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,26 @@
1212

1313
class MochaSim {
1414
public:
15-
MochaSim(const char *ram_hier_path, int ram_size_words);
15+
MochaSim(const char *sram_hier_path, int sram_size_words,
16+
const char *dram_hier_path, int dram_size_words);
1617
virtual ~MochaSim() {}
1718
virtual int Main(int argc, char **argv);
1819

1920

2021
protected:
2122
top_chip_verilator _top;
2223
VerilatorMemUtil _memutil;
23-
MemArea _ram;
24+
MemArea _sram, _dram;
2425

2526
virtual int Setup(int argc, char **argv, bool &exit_app);
2627
virtual void Run();
2728
virtual bool Finish();
2829
};
2930

30-
MochaSim::MochaSim(const char *ram_hier_path, int ram_size_words)
31-
: _ram(ram_hier_path, ram_size_words, 8) {}
31+
MochaSim::MochaSim(const char *sram_hier_path, int sram_size_words,
32+
const char *dram_hier_path, int dram_size_words)
33+
: _sram(sram_hier_path, sram_size_words, 8),
34+
_dram(dram_hier_path, dram_size_words, 8) {}
3235

3336
int MochaSim::Main(int argc, char **argv) {
3437
bool exit_app;
@@ -53,7 +56,8 @@ int MochaSim::Setup(int argc, char **argv, bool &exit_app) {
5356
simctrl.SetTop(&_top, &_top.clk_i, &_top.rst_ni,
5457
VerilatorSimCtrlFlags::ResetPolarityNegative);
5558

56-
_memutil.RegisterMemoryArea("ram", 0x10000000, &_ram);
59+
_memutil.RegisterMemoryArea("sram", 0x10000000, &_sram);
60+
_memutil.RegisterMemoryArea("dram", 0x80000000, &_dram);
5761
simctrl.RegisterExtension(&_memutil);
5862

5963
exit_app = false;
@@ -85,7 +89,9 @@ bool MochaSim::Finish() {
8589
int main(int argc, char **argv) {
8690
MochaSim mocha_sim(
8791
"TOP.top_chip_verilator.u_top_chip_system.u_axi_sram.u_ram",
88-
16 * 1024 // 16k 64-bit words = 128 KiB
92+
16 * 1024, // 16k 64-bit words = 128 KiB
93+
"TOP.top_chip_verilator.u_dram_wrapper.u_ext_mem",
94+
16 * 131072 // 131k 64-bit words = 2 GiB
8995
);
9096

9197
return mocha_sim.Main(argc, argv);

hw/vendor/lowrisc_ip/dv/verilator/cpp/verilator_memutil.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ static bool ParseMemArg(const std::string mem_argument, LoadArg *load_arg,
7777
// Print a usage message to stdout
7878
static void PrintHelp() {
7979
std::cout << "Simulation memory utilities:\n\n"
80-
"-r|--rominit=FILE\n"
81-
" Initialize the ROM with FILE (elf/vmem)\n\n"
82-
"-m|--raminit=FILE\n"
83-
" Initialize the RAM with FILE (elf/vmem)\n\n"
80+
"-r|--sraminit=FILE\n"
81+
" Initialize the SRAM with FILE (elf/vmem)\n\n"
82+
"-m|--draminit=FILE\n"
83+
" Initialize the DRAM with FILE (elf/vmem)\n\n"
8484
"-f|--flashinit=FILE\n"
8585
" Initialize the FLASH with FILE (elf/vmem)\n\n"
8686
"-l|--meminit=NAME,FILE[,TYPE]\n"
@@ -107,8 +107,8 @@ VerilatorMemUtil::VerilatorMemUtil(DpiMemUtil *mem_util) : mem_util_(mem_util) {
107107
bool VerilatorMemUtil::ParseCLIArguments(int argc, char **argv,
108108
bool &exit_app) {
109109
const struct option long_options[] = {
110-
{"rominit", required_argument, nullptr, 'r'},
111-
{"raminit", required_argument, nullptr, 'm'},
110+
{"sraminit", required_argument, nullptr, 'r'},
111+
{"draminit", required_argument, nullptr, 'm'},
112112
{"flashinit", required_argument, nullptr, 'f'},
113113
{"otpinit", required_argument, nullptr, 'o'},
114114
{"meminit", required_argument, nullptr, 'l'},
@@ -138,11 +138,11 @@ bool VerilatorMemUtil::ParseCLIArguments(int argc, char **argv,
138138
break;
139139
case 'r':
140140
load_args.push_back(
141-
{.name = "rom", .filepath = optarg, .type = kMemImageUnknown});
141+
{.name = "sram", .filepath = optarg, .type = kMemImageUnknown});
142142
break;
143143
case 'm':
144144
load_args.push_back(
145-
{.name = "ram", .filepath = optarg, .type = kMemImageUnknown});
145+
{.name = "dram", .filepath = optarg, .type = kMemImageUnknown});
146146
break;
147147
case 'f':
148148
load_args.push_back(
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
diff --git a/hw/vendor/lowrisc_ip/dv/verilator/cpp/verilator_memutil.cc b/hw/vendor/lowrisc_ip/dv/verilator/cpp/verilator_memutil.cc
2+
index a8295d3..af96336 100644
3+
--- a/hw/vendor/lowrisc_ip/dv/verilator/cpp/verilator_memutil.cc
4+
+++ b/hw/vendor/lowrisc_ip/dv/verilator/cpp/verilator_memutil.cc
5+
@@ -77,10 +77,10 @@ static bool ParseMemArg(const std::string mem_argument, LoadArg *load_arg,
6+
// Print a usage message to stdout
7+
static void PrintHelp() {
8+
std::cout << "Simulation memory utilities:\n\n"
9+
- "-r|--rominit=FILE\n"
10+
- " Initialize the ROM with FILE (elf/vmem)\n\n"
11+
- "-m|--raminit=FILE\n"
12+
- " Initialize the RAM with FILE (elf/vmem)\n\n"
13+
+ "-r|--sraminit=FILE\n"
14+
+ " Initialize the SRAM with FILE (elf/vmem)\n\n"
15+
+ "-m|--draminit=FILE\n"
16+
+ " Initialize the DRAM with FILE (elf/vmem)\n\n"
17+
"-f|--flashinit=FILE\n"
18+
" Initialize the FLASH with FILE (elf/vmem)\n\n"
19+
"-l|--meminit=NAME,FILE[,TYPE]\n"
20+
@@ -107,8 +107,8 @@ VerilatorMemUtil::VerilatorMemUtil(DpiMemUtil *mem_util) : mem_util_(mem_util) {
21+
bool VerilatorMemUtil::ParseCLIArguments(int argc, char **argv,
22+
bool &exit_app) {
23+
const struct option long_options[] = {
24+
- {"rominit", required_argument, nullptr, 'r'},
25+
- {"raminit", required_argument, nullptr, 'm'},
26+
+ {"sraminit", required_argument, nullptr, 'r'},
27+
+ {"draminit", required_argument, nullptr, 'm'},
28+
{"flashinit", required_argument, nullptr, 'f'},
29+
{"otpinit", required_argument, nullptr, 'o'},
30+
{"meminit", required_argument, nullptr, 'l'},
31+
@@ -138,11 +138,11 @@ bool VerilatorMemUtil::ParseCLIArguments(int argc, char **argv,
32+
break;
33+
case 'r':
34+
load_args.push_back(
35+
- {.name = "rom", .filepath = optarg, .type = kMemImageUnknown});
36+
+ {.name = "sram", .filepath = optarg, .type = kMemImageUnknown});
37+
break;
38+
case 'm':
39+
load_args.push_back(
40+
- {.name = "ram", .filepath = optarg, .type = kMemImageUnknown});
41+
+ {.name = "dram", .filepath = optarg, .type = kMemImageUnknown});
42+
break;
43+
case 'f':
44+
load_args.push_back(

0 commit comments

Comments
 (0)