use celox::Simulator;
#[path = "test_utils/mod.rs"]
#[macro_use]
mod test_utils;
all_backends! {
fn test_arithmetic_in_concat(sim) {
@setup { let code = r#"
module Top (
a: input logic<8>,
b: input logic<8>,
o: output logic<40>
) {
assign o = {a + b, a - b, a * b, a / b, a % b};
}
"#; }
@build Simulator::builder(code, "Top");
let a = sim.signal("a");
let b = sim.signal("b");
let o = sim.signal("o");
sim.modify(|io| {
io.set(a, 10u8);
io.set(b, 3u8);
})
.unwrap();
assert_eq!(sim.get(o), 0x0D071E0301u64.into());
}
fn test_comparison_in_concat(sim) {
@setup { let code = r#"
module Top (
a: input logic<8>,
b: input logic<8>,
o: output logic<6>
) {
assign o = {a == b, a != b, a <: b, a >: b, a <= b, a >= b};
}
"#; }
@build Simulator::builder(code, "Top");
let a = sim.signal("a");
let b = sim.signal("b");
let o = sim.signal("o");
sim.modify(|io| {
io.set(a, 10u8);
io.set(b, 20u8);
})
.unwrap();
assert_eq!(sim.get(o), 0x1Au8.into());
}
fn test_bitwise_and_logical_in_concat(sim) {
@setup { let code = r#"
module Top (
a: input logic<8>,
b: input logic<8>,
o: output logic<32>,
o2: output logic<3>
) {
assign o = {a & b, a | b, a ^ b, (~a)};
assign o2 = {(|a) && (|b), (|a) || (|b), (!(|a))};
}
"#; }
@build Simulator::builder(code, "Top");
let a = sim.signal("a");
let b = sim.signal("b");
let o = sim.signal("o");
let o2 = sim.signal("o2");
sim.modify(|io| {
io.set(a, 0xAAu8); io.set(b, 0x55u8); })
.unwrap();
let expected = (0xFFu32 << (8 + 8)) | (0xFFu32 << 8) | 0x55u32;
let expected2 = (1u8 << 2) | (1u8 << 1);
assert_eq!(sim.get(o), expected.into());
assert_eq!(sim.get(o2), expected2.into());
}
fn test_ternary_in_concat(sim) {
@setup { let code = r#"
module Top (
sel: input logic,
a: input logic<8>,
b: input logic<8>,
o: output logic<16>
) {
assign o = {(if sel ? a : b), (if !sel ? a : b)};
}
"#; }
@build Simulator::builder(code, "Top");
let sel = sim.signal("sel");
let a = sim.signal("a");
let b = sim.signal("b");
let o = sim.signal("o");
sim.modify(|io| {
io.set(a, 0xAAu8);
io.set(b, 0xBBu8);
})
.unwrap();
sim.modify(|io| io.set(sel, 1u8)).unwrap();
assert_eq!(sim.get(o), 0xAABBu16.into());
sim.modify(|io| io.set(sel, 0u8)).unwrap();
assert_eq!(sim.get(o), 0xBBAAu16.into());
}
fn test_as_cast_in_concat(sim) {
@ignore_on(veryl, sv);
@setup { let code = r#"
module Top (
a: input logic<16>,
o: output logic<16>
) {
assign o = {a[15:8] as u8, a[7:0] as u16};
}
"#; }
@build Simulator::builder(code, "Top");
let a = sim.signal("a");
let o = sim.signal("o");
sim.modify(|io| io.set(a, 0x1234u16)).unwrap();
assert_eq!(sim.get(o), 0x0034u16.into());
}
fn test_nested_concat_and_repeat(sim) {
@setup { let code = r#"
module Top (
a: input logic<4>,
o: output logic<16>
) {
assign o = {{a, a} repeat 2};
}
"#; }
@build Simulator::builder(code, "Top");
let a = sim.signal("a");
let o = sim.signal("o");
sim.modify(|io| io.set(a, 0x5u8)).unwrap();
assert_eq!(sim.get(o), 0x5555u16.into());
}
fn test_shift_in_concat(sim) {
@setup {
let code = r#"
module Top (
a: input logic<8>,
o: output logic<32>
) {
assign o = {a << 2, a >> 2, a <<< 2, a >>> 2};
}
"#;
}
@build Simulator::builder(code, "Top");
let a = sim.signal("a");
let o = sim.signal("o");
sim.modify(|io| io.set(a, 0x40u8)).unwrap();
let expected = 0x00100010u32;
assert_eq!(sim.get(o), expected.into());
}
}