Compare commits

...

2 commits

Author SHA1 Message Date
Tobias Alexandra Platen
672a29e76d run cargo fmt on main_memory 2025-10-14 20:11:24 +02:00
Tobias Alexandra Platen
35ea85d074 add write port 2025-10-14 20:08:29 +02:00
2 changed files with 38 additions and 19 deletions

View file

@ -29,14 +29,18 @@ pub fn main_memory(config: &CpuConfig) {
let read_data: UInt<8> = m.output();
#[hdl]
let en: Bool = m.input();
#[hdl]
// add write support
#[hdl]
let write_en: Bool = m.input();
#[hdl]
let write_data: UInt<8> = m.input();
#[hdl]
let cd: ClockDomain = m.input();
// for each instance do
// connect(instance.cd, cd);
#[hdl]
#[hdl]
//let mut mem = memory_with_init([0x12u8, 0x34, 0x56, 0x78]);
let mut my_memory = memory_with_init([0x12_hdl_u8, 0x34_hdl_u8, 0x56_hdl_u8, 0x78_hdl_u8]);
@ -46,18 +50,21 @@ pub fn main_memory(config: &CpuConfig) {
connect_any(read_port.addr, addr); //FIXME
connect_any(read_port.en, addr.cmp_lt(4u64));
connect(read_port.clk, cd.clk);
connect(read_data,read_port.data);
connect(read_data, read_port.data);
let write_port = my_memory.new_write_port();
connect_any(write_port.addr, addr);
connect_any(write_port.en, addr.cmp_lt(4u64) & write_en);
connect_any(write_port.data, write_data);
connect(write_port.clk, cd.clk);
//connect_any(write_port.mask, 0xFFu8); //try that one
connect_any(write_port.mask, true);
}
// see https://git.libre-chip.org/libre-chip/fayalite/src/branch/master/crates/fayalite/tests/sim.rs
// how to write testbenches
// start with a very simple memory model ->
// TODO create a branch for the memory
// start with a very simple memory model ->
// TODO create a branch for the memory
// 1 connect up the read port, add write later
// ask how I make the memory pipelined later ... not today

View file

@ -4,10 +4,10 @@
use cpu::{
config::{CpuConfig, UnitConfig},
instruction::{AddSubMOp, LogicalMOp, MOp, MOpDestReg, MOpRegNum, OutputIntegerMode},
main_memory::main_memory,
reg_alloc::{FetchedDecodedMOp, reg_alloc},
register::{FlagsMode, PRegFlagsPowerISA},
unit::{GlobalState, UnitKind},
main_memory::main_memory,
};
use fayalite::{
assert_export_firrtl,
@ -41,6 +41,8 @@ fn test_main_memory() {
sim.write(sim.io().en, true);
sim.write(sim.io().cd.rst, false);
sim.write(sim.io().cd.clk, false);
sim.write(sim.io().write_en, false);
sim.write(sim.io().write_data, 0xFFu8);
// TODO convert to for loop
// you need to write an initial value to all inputs before you can start running the simulation
@ -49,16 +51,26 @@ fn test_main_memory() {
sim.advance_time(SimDuration::from_micros(1)); //panic here at simulation
dbg!(sim.read(sim.io().read_data)); // dbg! macro just displays the value you pass to it
for n in 0u64..4u64 {
sim.write(sim.io().addr, n);
// now wait 1us because why not
sim.advance_time(SimDuration::from_micros(1));
// now wait 1us because why not
sim.advance_time(SimDuration::from_micros(1));
}
sim.write(sim.io().write_en, true);
sim.write(sim.io().addr, 0u64);
sim.write(sim.io().write_data, 0x11u8);
sim.advance_time(SimDuration::from_micros(1));
sim.write(sim.io().addr, 1u64);
sim.write(sim.io().write_data, 0x22u8);
sim.advance_time(SimDuration::from_micros(1));
sim.write(sim.io().addr, 2u64);
sim.write(sim.io().write_data, 0x33u8);
sim.advance_time(SimDuration::from_micros(1));
sim.write(sim.io().addr, 3u64);
sim.write(sim.io().write_data, 0x44u8);
sim.advance_time(SimDuration::from_micros(1));
sim.flush_traces().unwrap(); // make sure everything is written to the output file
}