tests/sim: add test for memory rw port
This commit is contained in:
parent
903ca1bf30
commit
c756aeec70
|
@ -694,4 +694,277 @@ fn test_memories() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[hdl_module(outline_generated)]
|
||||||
|
pub fn memories2() {
|
||||||
|
#[hdl]
|
||||||
|
let rw: fayalite::memory::ReadWriteStruct<UInt<2>, ConstUsize<3>> = m.input();
|
||||||
|
#[hdl]
|
||||||
|
let mut mem = memory_with_init([HdlSome(true); 5]);
|
||||||
|
mem.read_latency(1);
|
||||||
|
mem.write_latency(NonZeroUsize::new(1).unwrap());
|
||||||
|
mem.read_under_write(ReadUnderWrite::New);
|
||||||
|
let rw_port = mem.new_rw_port();
|
||||||
|
connect_any(rw_port.addr, rw.addr);
|
||||||
|
connect(rw_port.en, rw.en);
|
||||||
|
connect(rw_port.clk, rw.clk);
|
||||||
|
connect_any(rw.rdata, rw_port.rdata.cast_to_bits());
|
||||||
|
connect(rw_port.wmode, rw.wmode);
|
||||||
|
connect(rw_port.wdata, HdlNone());
|
||||||
|
#[hdl]
|
||||||
|
if rw.wdata[0] {
|
||||||
|
connect(rw_port.wdata, HdlSome(rw.wdata[1]));
|
||||||
|
}
|
||||||
|
connect(rw_port.wmask, rw.wmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[hdl]
|
||||||
|
#[test]
|
||||||
|
fn test_memories2() {
|
||||||
|
let _n = SourceLocation::normalize_files_for_tests();
|
||||||
|
let mut sim = Simulation::new(memories2());
|
||||||
|
let mut writer = RcWriter::default();
|
||||||
|
sim.add_trace_writer(VcdWriterDecls::new(writer.clone()));
|
||||||
|
sim.write_clock(sim.io().rw.clk, false);
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
struct IO {
|
||||||
|
addr: u8,
|
||||||
|
en: bool,
|
||||||
|
rdata: u8,
|
||||||
|
wmode: bool,
|
||||||
|
wdata: u8,
|
||||||
|
wmask: bool,
|
||||||
|
}
|
||||||
|
let io_cycles = [
|
||||||
|
IO {
|
||||||
|
addr: 0,
|
||||||
|
en: false,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 0,
|
||||||
|
en: true,
|
||||||
|
rdata: 0x3,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 0,
|
||||||
|
en: false,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 0,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: true,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 0,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 0,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 3,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 1,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 1,
|
||||||
|
wmask: true,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 2,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 2,
|
||||||
|
wmask: true,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 3,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 3,
|
||||||
|
wmask: true,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 4,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 2,
|
||||||
|
wmask: true,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 5,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 1,
|
||||||
|
wmask: true,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 6,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 1,
|
||||||
|
wmask: true,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 7,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: true,
|
||||||
|
wdata: 1,
|
||||||
|
wmask: true,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 7,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 6,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 5,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 4,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 3,
|
||||||
|
en: true,
|
||||||
|
rdata: 3,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 2,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 0,
|
||||||
|
en: true,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 1,
|
||||||
|
en: true,
|
||||||
|
rdata: 1,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
IO {
|
||||||
|
addr: 0,
|
||||||
|
en: false,
|
||||||
|
rdata: 0,
|
||||||
|
wmode: false,
|
||||||
|
wdata: 0,
|
||||||
|
wmask: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
for (
|
||||||
|
cycle,
|
||||||
|
expected @ IO {
|
||||||
|
addr,
|
||||||
|
en,
|
||||||
|
rdata: _,
|
||||||
|
wmode,
|
||||||
|
wdata,
|
||||||
|
wmask,
|
||||||
|
},
|
||||||
|
) in io_cycles.into_iter().enumerate()
|
||||||
|
{
|
||||||
|
sim.write_bool_or_int(sim.io().rw.addr, addr.cast_to_static());
|
||||||
|
sim.write_bool(sim.io().rw.en, en);
|
||||||
|
sim.write_bool(sim.io().rw.wmode, wmode);
|
||||||
|
sim.write_bool_or_int(sim.io().rw.wdata, wdata.cast_to_static());
|
||||||
|
sim.write_bool(sim.io().rw.wmask, wmask);
|
||||||
|
sim.advance_time(SimDuration::from_nanos(250));
|
||||||
|
sim.write_clock(sim.io().rw.clk, true);
|
||||||
|
sim.advance_time(SimDuration::from_nanos(250));
|
||||||
|
let io = IO {
|
||||||
|
addr,
|
||||||
|
en,
|
||||||
|
rdata: sim
|
||||||
|
.read_bool_or_int(sim.io().rw.rdata)
|
||||||
|
.to_bigint()
|
||||||
|
.try_into()
|
||||||
|
.expect("known to be in range"),
|
||||||
|
wmode,
|
||||||
|
wdata,
|
||||||
|
wmask,
|
||||||
|
};
|
||||||
|
assert_eq!(
|
||||||
|
expected,
|
||||||
|
io,
|
||||||
|
"cycle: {cycle}\nvcd:\n{}",
|
||||||
|
String::from_utf8(writer.take()).unwrap(),
|
||||||
|
);
|
||||||
|
sim.advance_time(SimDuration::from_nanos(250));
|
||||||
|
sim.write_clock(sim.io().rw.clk, false);
|
||||||
|
sim.advance_time(SimDuration::from_nanos(250));
|
||||||
|
}
|
||||||
|
sim.flush_traces().unwrap();
|
||||||
|
let vcd = String::from_utf8(writer.take()).unwrap();
|
||||||
|
println!("####### VCD:\n{vcd}\n#######");
|
||||||
|
if vcd != include_str!("sim/expected/memories2.vcd") {
|
||||||
|
panic!();
|
||||||
|
}
|
||||||
|
let sim_debug = format!("{sim:#?}");
|
||||||
|
println!("#######\n{sim_debug}\n#######");
|
||||||
|
if sim_debug != include_str!("sim/expected/memories2.txt") {
|
||||||
|
panic!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: add more tests for memories
|
// TODO: add more tests for memories
|
||||||
|
|
1694
crates/fayalite/tests/sim/expected/memories2.txt
Normal file
1694
crates/fayalite/tests/sim/expected/memories2.txt
Normal file
File diff suppressed because it is too large
Load diff
363
crates/fayalite/tests/sim/expected/memories2.vcd
Normal file
363
crates/fayalite/tests/sim/expected/memories2.vcd
Normal file
|
@ -0,0 +1,363 @@
|
||||||
|
$timescale 1 ps $end
|
||||||
|
$scope module memories2 $end
|
||||||
|
$scope struct rw $end
|
||||||
|
$var wire 3 ! addr $end
|
||||||
|
$var wire 1 " en $end
|
||||||
|
$var wire 1 # clk $end
|
||||||
|
$var wire 2 $ rdata $end
|
||||||
|
$var wire 1 % wmode $end
|
||||||
|
$var wire 2 & wdata $end
|
||||||
|
$var wire 1 ' wmask $end
|
||||||
|
$upscope $end
|
||||||
|
$scope struct mem $end
|
||||||
|
$scope struct contents $end
|
||||||
|
$scope struct [0] $end
|
||||||
|
$scope struct mem $end
|
||||||
|
$var string 1 1 \$tag $end
|
||||||
|
$var reg 1 6 HdlSome $end
|
||||||
|
$upscope $end
|
||||||
|
$upscope $end
|
||||||
|
$scope struct [1] $end
|
||||||
|
$scope struct mem $end
|
||||||
|
$var string 1 2 \$tag $end
|
||||||
|
$var reg 1 7 HdlSome $end
|
||||||
|
$upscope $end
|
||||||
|
$upscope $end
|
||||||
|
$scope struct [2] $end
|
||||||
|
$scope struct mem $end
|
||||||
|
$var string 1 3 \$tag $end
|
||||||
|
$var reg 1 8 HdlSome $end
|
||||||
|
$upscope $end
|
||||||
|
$upscope $end
|
||||||
|
$scope struct [3] $end
|
||||||
|
$scope struct mem $end
|
||||||
|
$var string 1 4 \$tag $end
|
||||||
|
$var reg 1 9 HdlSome $end
|
||||||
|
$upscope $end
|
||||||
|
$upscope $end
|
||||||
|
$scope struct [4] $end
|
||||||
|
$scope struct mem $end
|
||||||
|
$var string 1 5 \$tag $end
|
||||||
|
$var reg 1 : HdlSome $end
|
||||||
|
$upscope $end
|
||||||
|
$upscope $end
|
||||||
|
$upscope $end
|
||||||
|
$scope struct rw0 $end
|
||||||
|
$var wire 3 ( addr $end
|
||||||
|
$var wire 1 ) en $end
|
||||||
|
$var wire 1 * clk $end
|
||||||
|
$scope struct rdata $end
|
||||||
|
$var string 1 + \$tag $end
|
||||||
|
$var wire 1 , HdlSome $end
|
||||||
|
$upscope $end
|
||||||
|
$var wire 1 - wmode $end
|
||||||
|
$scope struct wdata $end
|
||||||
|
$var string 1 . \$tag $end
|
||||||
|
$var wire 1 / HdlSome $end
|
||||||
|
$upscope $end
|
||||||
|
$var wire 1 0 wmask $end
|
||||||
|
$upscope $end
|
||||||
|
$upscope $end
|
||||||
|
$upscope $end
|
||||||
|
$enddefinitions $end
|
||||||
|
$dumpvars
|
||||||
|
sHdlSome\x20(1) 1
|
||||||
|
16
|
||||||
|
sHdlSome\x20(1) 2
|
||||||
|
17
|
||||||
|
sHdlSome\x20(1) 3
|
||||||
|
18
|
||||||
|
sHdlSome\x20(1) 4
|
||||||
|
19
|
||||||
|
sHdlSome\x20(1) 5
|
||||||
|
1:
|
||||||
|
b0 !
|
||||||
|
0"
|
||||||
|
0#
|
||||||
|
b0 $
|
||||||
|
0%
|
||||||
|
b0 &
|
||||||
|
0'
|
||||||
|
b0 (
|
||||||
|
0)
|
||||||
|
0*
|
||||||
|
sHdlNone\x20(0) +
|
||||||
|
0,
|
||||||
|
0-
|
||||||
|
sHdlNone\x20(0) .
|
||||||
|
0/
|
||||||
|
00
|
||||||
|
$end
|
||||||
|
#250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#500000
|
||||||
|
#750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#1000000
|
||||||
|
1"
|
||||||
|
1)
|
||||||
|
#1250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
b11 $
|
||||||
|
sHdlSome\x20(1) +
|
||||||
|
1,
|
||||||
|
#1500000
|
||||||
|
#1750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#2000000
|
||||||
|
0"
|
||||||
|
0)
|
||||||
|
#2250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
b0 $
|
||||||
|
sHdlNone\x20(0) +
|
||||||
|
0,
|
||||||
|
#2500000
|
||||||
|
#2750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#3000000
|
||||||
|
1"
|
||||||
|
1%
|
||||||
|
1'
|
||||||
|
1)
|
||||||
|
1-
|
||||||
|
10
|
||||||
|
#3250000
|
||||||
|
sHdlNone\x20(0) 1
|
||||||
|
06
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#3500000
|
||||||
|
#3750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#4000000
|
||||||
|
0%
|
||||||
|
0'
|
||||||
|
0-
|
||||||
|
00
|
||||||
|
#4250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#4500000
|
||||||
|
#4750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#5000000
|
||||||
|
1%
|
||||||
|
b11 &
|
||||||
|
1-
|
||||||
|
sHdlSome\x20(1) .
|
||||||
|
1/
|
||||||
|
#5250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#5500000
|
||||||
|
#5750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#6000000
|
||||||
|
b1 !
|
||||||
|
b1 &
|
||||||
|
1'
|
||||||
|
b1 (
|
||||||
|
0/
|
||||||
|
10
|
||||||
|
#6250000
|
||||||
|
sHdlSome\x20(1) 2
|
||||||
|
07
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#6500000
|
||||||
|
#6750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#7000000
|
||||||
|
b10 !
|
||||||
|
b10 &
|
||||||
|
b10 (
|
||||||
|
sHdlNone\x20(0) .
|
||||||
|
#7250000
|
||||||
|
sHdlNone\x20(0) 3
|
||||||
|
08
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#7500000
|
||||||
|
#7750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#8000000
|
||||||
|
b11 !
|
||||||
|
b11 &
|
||||||
|
b11 (
|
||||||
|
sHdlSome\x20(1) .
|
||||||
|
1/
|
||||||
|
#8250000
|
||||||
|
sHdlSome\x20(1) 4
|
||||||
|
19
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#8500000
|
||||||
|
#8750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#9000000
|
||||||
|
b100 !
|
||||||
|
b10 &
|
||||||
|
b100 (
|
||||||
|
sHdlNone\x20(0) .
|
||||||
|
0/
|
||||||
|
#9250000
|
||||||
|
sHdlNone\x20(0) 5
|
||||||
|
0:
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#9500000
|
||||||
|
#9750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#10000000
|
||||||
|
b101 !
|
||||||
|
b1 &
|
||||||
|
b101 (
|
||||||
|
sHdlSome\x20(1) .
|
||||||
|
#10250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#10500000
|
||||||
|
#10750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#11000000
|
||||||
|
b110 !
|
||||||
|
b110 (
|
||||||
|
#11250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#11500000
|
||||||
|
#11750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#12000000
|
||||||
|
b111 !
|
||||||
|
b111 (
|
||||||
|
#12250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#12500000
|
||||||
|
#12750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#13000000
|
||||||
|
0%
|
||||||
|
b0 &
|
||||||
|
0'
|
||||||
|
0-
|
||||||
|
sHdlNone\x20(0) .
|
||||||
|
00
|
||||||
|
#13250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#13500000
|
||||||
|
#13750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#14000000
|
||||||
|
b110 !
|
||||||
|
b110 (
|
||||||
|
#14250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#14500000
|
||||||
|
#14750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#15000000
|
||||||
|
b101 !
|
||||||
|
b101 (
|
||||||
|
#15250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#15500000
|
||||||
|
#15750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#16000000
|
||||||
|
b100 !
|
||||||
|
b100 (
|
||||||
|
#16250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#16500000
|
||||||
|
#16750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#17000000
|
||||||
|
b11 !
|
||||||
|
b11 (
|
||||||
|
#17250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
b11 $
|
||||||
|
sHdlSome\x20(1) +
|
||||||
|
1,
|
||||||
|
#17500000
|
||||||
|
#17750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#18000000
|
||||||
|
b10 !
|
||||||
|
b10 (
|
||||||
|
#18250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
b0 $
|
||||||
|
sHdlNone\x20(0) +
|
||||||
|
0,
|
||||||
|
#18500000
|
||||||
|
#18750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#19000000
|
||||||
|
b0 !
|
||||||
|
b0 (
|
||||||
|
#19250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
#19500000
|
||||||
|
#19750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#20000000
|
||||||
|
b1 !
|
||||||
|
b1 (
|
||||||
|
#20250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
b1 $
|
||||||
|
sHdlSome\x20(1) +
|
||||||
|
#20500000
|
||||||
|
#20750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#21000000
|
||||||
|
b0 !
|
||||||
|
0"
|
||||||
|
b0 (
|
||||||
|
0)
|
||||||
|
#21250000
|
||||||
|
1#
|
||||||
|
1*
|
||||||
|
b0 $
|
||||||
|
sHdlNone\x20(0) +
|
||||||
|
#21500000
|
||||||
|
#21750000
|
||||||
|
0#
|
||||||
|
0*
|
||||||
|
#22000000
|
Loading…
Reference in a new issue