from __future__ import annotations import cocotb from cocotb.clock import Clock from cocotb.triggers import RisingEdge from model.ref_model import generate_write_flip_mask async def reset_write_noise(dut): dut.rst_n.value = 0 dut.wr_valid.value = 0 dut.wr_row.value = 0 dut.wr_hash.value = 0 for _ in range(3): await RisingEdge(dut.clk) dut.rst_n.value = 1 for _ in range(2): await RisingEdge(dut.clk) @cocotb.test() async def write_noise_outputs_grouped_noisy_hash(dut): cocotb.start_soon(Clock(dut.clk, 10, unit="ns").start()) await reset_write_noise(dut) value = 0x123456789ABCDEF dut.wr_row.value = 3 dut.wr_hash.value = value dut.wr_valid.value = 1 await RisingEdge(dut.clk) dut.wr_valid.value = 0 while int(dut.core_wr_valid.value) == 0: await RisingEdge(dut.clk) seed = 0xB504_F32D_B504_F32D flip, _ = generate_write_flip_mask((seed << 64) | seed, 512, 8, 1, 100) assert int(dut.core_wr_row.value) == 3 assert int(dut.core_wr_hash.value) == (value ^ flip)