use celox::Simulator;
#[path = "test_utils/mod.rs"]
#[macro_use]
mod test_utils;
all_backends! {
fn test_reset_async_high(sim) {
@ignore_on(veryl);
@setup { let code = r#"
module Top (
clk: input clock,
rst: input reset_async_high,
d: input logic<8>,
q: output logic<8>
) {
var r: logic<8>;
always_ff (clk, rst) {
if_reset {
r = 8'd0;
} else {
r = d;
}
}
assign q = r;
}
"#; }
@build Simulator::builder(code, "Top");
let clk = sim.event("clk");
let rst = sim.signal("rst");
let d = sim.signal("d");
let q = sim.signal("q");
sim.modify(|io| {
io.set(rst, 1u8);
io.set(d, 0xAAu8);
})
.unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0u8.into());
sim.modify(|io| io.set(rst, 0u8)).unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0xAAu8.into());
sim.modify(|io| io.set(d, 0x55u8)).unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0x55u8.into());
sim.modify(|io| io.set(rst, 1u8)).unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0u8.into());
}
fn test_reset_sync_high(sim) {
@ignore_on(veryl);
@setup { let code = r#"
module Top (
clk: input clock,
rst: input reset_sync_high,
d: input logic<8>,
q: output logic<8>
) {
var r: logic<8>;
always_ff (clk, rst) {
if_reset {
r = 8'd0;
} else {
r = d;
}
}
assign q = r;
}
"#; }
@build Simulator::builder(code, "Top");
let clk = sim.event("clk");
let rst = sim.signal("rst");
let d = sim.signal("d");
let q = sim.signal("q");
sim.modify(|io| {
io.set(rst, 1u8);
io.set(d, 0xBBu8);
})
.unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0u8.into());
sim.modify(|io| io.set(rst, 0u8)).unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0xBBu8.into());
}
fn test_reset_sync_low(sim) {
@ignore_on(veryl);
@setup { let code = r#"
module Top (
clk: input clock,
rst: input reset_sync_low,
d: input logic<8>,
q: output logic<8>
) {
var r: logic<8>;
always_ff (clk, rst) {
if_reset {
r = 8'd0;
} else {
r = d;
}
}
assign q = r;
}
"#; }
@build Simulator::builder(code, "Top");
let clk = sim.event("clk");
let rst = sim.signal("rst");
let d = sim.signal("d");
let q = sim.signal("q");
sim.modify(|io| {
io.set(rst, 0u8);
io.set(d, 0xCCu8);
})
.unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0u8.into());
sim.modify(|io| io.set(rst, 1u8)).unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0xCCu8.into());
}
fn test_shared_reset(sim) {
@ignore_on(veryl);
@setup { let code = r#"
module Top (
clk: input clock,
rst: input reset,
d1: input logic<8>,
d2: input logic<8>,
q1: output logic<8>,
q2: output logic<8>
) {
var r1: logic<8>;
var r2: logic<8>;
always_ff (clk, rst) {
if_reset {
r1 = 8'h00;
} else {
r1 = d1;
}
}
always_ff (clk, rst) {
if_reset {
r2 = 8'hFF;
} else {
r2 = d2;
}
}
assign q1 = r1;
assign q2 = r2;
}
"#; }
@build Simulator::builder(code, "Top");
let clk = sim.event("clk");
let rst = sim.signal("rst");
let d1 = sim.signal("d1");
let d2 = sim.signal("d2");
let q1 = sim.signal("q1");
let q2 = sim.signal("q2");
sim.modify(|io| {
io.set(rst, 0u8);
io.set(d1, 0xAAu8);
io.set(d2, 0xBBu8);
})
.unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q1), 0x00u8.into());
assert_eq!(sim.get(q2), 0xFFu8.into());
sim.modify(|io| io.set(rst, 1u8)).unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q1), 0xAAu8.into());
assert_eq!(sim.get(q2), 0xBBu8.into());
}
fn test_nonzero_reset_value(sim) {
@ignore_on(veryl);
@setup { let code = r#"
module Top (
clk: input clock,
rst: input reset,
d: input logic<8>,
q: output logic<8>
) {
var r: logic<8>;
always_ff (clk, rst) {
if_reset {
r = 8'hDE;
} else {
r = d;
}
}
assign q = r;
}
"#; }
@build Simulator::builder(code, "Top");
let clk = sim.event("clk");
let rst = sim.signal("rst");
let d = sim.signal("d");
let q = sim.signal("q");
sim.modify(|io| {
io.set(rst, 0u8);
io.set(d, 0x00u8);
})
.unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0xDEu8.into());
sim.modify(|io| io.set(rst, 1u8)).unwrap();
sim.tick(clk).unwrap();
assert_eq!(sim.get(q), 0x00u8.into());
}
}