| // Copyright 2025 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <iostream> |
| |
| #include "verilated_toplevel.h" |
| #include "verilator_memutil.h" |
| #include "verilator_sim_ctrl.h" |
| |
| int main(int argc, char **argv) { |
| chip_verilator top; |
| VerilatorMemUtil memutil; |
| VerilatorSimCtrl &simctrl = VerilatorSimCtrl::GetInstance(); |
| simctrl.SetTop(&top, &top.clk_i, &top.rst_ni, |
| VerilatorSimCtrlFlags::ResetPolarityNegative); |
| |
| // NB: Final parameter here is "width" of your memory, penultimate parameter |
| // is "depth". |
| MemArea rom("TOP.chip_verilator.i_kelvin_soc.i_rom.u_prim_rom", 0x8000 / 4, |
| 4); |
| MemArea sram("TOP.chip_verilator.i_kelvin_soc.i_sram", 0x400000 / 4, 4); |
| MemArea itcm( |
| "TOP.chip_verilator.i_kelvin_soc.i_kelvin_core.coreAxi.itcm.sram." |
| "sramModules_0", |
| 0x2000 / 16, 16); |
| MemArea dtcm( |
| "TOP.chip_verilator.i_kelvin_soc.i_kelvin_core.coreAxi.dtcm.sram." |
| "sramModules_0", |
| 0x8000 / 16, 16); |
| |
| memutil.RegisterMemoryArea("rom", 0x10000000, &rom); |
| memutil.RegisterMemoryArea("sram", 0x20000000, &sram); |
| memutil.RegisterMemoryArea("itcm", 0x00000000, &itcm); |
| memutil.RegisterMemoryArea("dtcm", 0x00010000, &dtcm); |
| simctrl.RegisterExtension(&memutil); |
| |
| simctrl.SetInitialResetDelay(2000); |
| simctrl.SetResetDuration(10); |
| |
| std::cout << "Simulation of Kelvin SoC" << std::endl |
| << "======================" << std::endl |
| << std::endl; |
| |
| return simctrl.Exec(argc, argv).first; |
| } |