test: Add regression tests for instrumentation
This commit is contained in:
parent
5f2cb6545a
commit
300001bcdd
|
|
@ -0,0 +1,42 @@
|
|||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||
//
|
||||
// DESCRIPTION: Verilator: Verilog Test module
|
||||
//
|
||||
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||
// any use, without warranty, 2024 by Wilson Snyder.
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
#include <verilated.h>
|
||||
#include <verilated_vcd_c.h>
|
||||
|
||||
#include <fstream>
|
||||
|
||||
#include VM_PREFIX_INCLUDE
|
||||
|
||||
unsigned long long main_time = 0;
|
||||
double sc_time_stamp() { return main_time; }
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
Verilated::debug(0);
|
||||
Verilated::commandArgs(argc, argv);
|
||||
|
||||
std::unique_ptr<VM_PREFIX> top{new VM_PREFIX{"top"}};
|
||||
|
||||
std::ofstream logFile("obj_vlt/t_instrumentation/simulation_output.log");
|
||||
if (!logFile.is_open()) {
|
||||
printf("Error: Could not open log file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (main_time <= 100) {
|
||||
top->eval();
|
||||
logFile << "$time: " << main_time << " | "
|
||||
<< "Output outa: " << static_cast<int>(top->outa) << " | "
|
||||
<< "Output outb: " << static_cast<int>(top->outb) << std::endl;
|
||||
++main_time;
|
||||
}
|
||||
top->final();
|
||||
top.reset();
|
||||
printf("*-* All Finished *-*\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
$time: 0 | Output outa: 0 | Output outb: 50
|
||||
$time: 1 | Output outa: 0 | Output outb: 50
|
||||
$time: 2 | Output outa: 0 | Output outb: 50
|
||||
$time: 3 | Output outa: 0 | Output outb: 50
|
||||
$time: 4 | Output outa: 0 | Output outb: 50
|
||||
$time: 5 | Output outa: 0 | Output outb: 50
|
||||
$time: 6 | Output outa: 0 | Output outb: 50
|
||||
$time: 7 | Output outa: 0 | Output outb: 50
|
||||
$time: 8 | Output outa: 0 | Output outb: 50
|
||||
$time: 9 | Output outa: 0 | Output outb: 50
|
||||
$time: 10 | Output outa: 0 | Output outb: 50
|
||||
$time: 11 | Output outa: 0 | Output outb: 50
|
||||
$time: 12 | Output outa: 0 | Output outb: 50
|
||||
$time: 13 | Output outa: 0 | Output outb: 50
|
||||
$time: 14 | Output outa: 0 | Output outb: 50
|
||||
$time: 15 | Output outa: 0 | Output outb: 50
|
||||
$time: 16 | Output outa: 0 | Output outb: 50
|
||||
$time: 17 | Output outa: 0 | Output outb: 50
|
||||
$time: 18 | Output outa: 0 | Output outb: 50
|
||||
$time: 19 | Output outa: 0 | Output outb: 50
|
||||
$time: 20 | Output outa: 0 | Output outb: 50
|
||||
$time: 21 | Output outa: 0 | Output outb: 50
|
||||
$time: 22 | Output outa: 0 | Output outb: 50
|
||||
$time: 23 | Output outa: 0 | Output outb: 50
|
||||
$time: 24 | Output outa: 0 | Output outb: 50
|
||||
$time: 25 | Output outa: 0 | Output outb: 50
|
||||
$time: 26 | Output outa: 0 | Output outb: 50
|
||||
$time: 27 | Output outa: 0 | Output outb: 50
|
||||
$time: 28 | Output outa: 0 | Output outb: 50
|
||||
$time: 29 | Output outa: 0 | Output outb: 50
|
||||
$time: 30 | Output outa: 0 | Output outb: 50
|
||||
$time: 31 | Output outa: 0 | Output outb: 50
|
||||
$time: 32 | Output outa: 0 | Output outb: 50
|
||||
$time: 33 | Output outa: 0 | Output outb: 50
|
||||
$time: 34 | Output outa: 0 | Output outb: 50
|
||||
$time: 35 | Output outa: 0 | Output outb: 50
|
||||
$time: 36 | Output outa: 0 | Output outb: 50
|
||||
$time: 37 | Output outa: 0 | Output outb: 50
|
||||
$time: 38 | Output outa: 0 | Output outb: 50
|
||||
$time: 39 | Output outa: 0 | Output outb: 50
|
||||
$time: 40 | Output outa: 0 | Output outb: 50
|
||||
$time: 41 | Output outa: 0 | Output outb: 50
|
||||
$time: 42 | Output outa: 0 | Output outb: 50
|
||||
$time: 43 | Output outa: 0 | Output outb: 50
|
||||
$time: 44 | Output outa: 0 | Output outb: 50
|
||||
$time: 45 | Output outa: 0 | Output outb: 50
|
||||
$time: 46 | Output outa: 0 | Output outb: 50
|
||||
$time: 47 | Output outa: 0 | Output outb: 50
|
||||
$time: 48 | Output outa: 0 | Output outb: 50
|
||||
$time: 49 | Output outa: 0 | Output outb: 50
|
||||
$time: 50 | Output outa: 0 | Output outb: 50
|
||||
$time: 51 | Output outa: 0 | Output outb: 50
|
||||
$time: 52 | Output outa: 0 | Output outb: 50
|
||||
$time: 53 | Output outa: 0 | Output outb: 50
|
||||
$time: 54 | Output outa: 0 | Output outb: 50
|
||||
$time: 55 | Output outa: 0 | Output outb: 50
|
||||
$time: 56 | Output outa: 0 | Output outb: 50
|
||||
$time: 57 | Output outa: 0 | Output outb: 50
|
||||
$time: 58 | Output outa: 0 | Output outb: 50
|
||||
$time: 59 | Output outa: 0 | Output outb: 50
|
||||
$time: 60 | Output outa: 0 | Output outb: 50
|
||||
$time: 61 | Output outa: 0 | Output outb: 50
|
||||
$time: 62 | Output outa: 0 | Output outb: 50
|
||||
$time: 63 | Output outa: 0 | Output outb: 50
|
||||
$time: 64 | Output outa: 0 | Output outb: 50
|
||||
$time: 65 | Output outa: 0 | Output outb: 50
|
||||
$time: 66 | Output outa: 0 | Output outb: 50
|
||||
$time: 67 | Output outa: 0 | Output outb: 50
|
||||
$time: 68 | Output outa: 0 | Output outb: 50
|
||||
$time: 69 | Output outa: 0 | Output outb: 50
|
||||
$time: 70 | Output outa: 0 | Output outb: 50
|
||||
$time: 71 | Output outa: 0 | Output outb: 50
|
||||
$time: 72 | Output outa: 0 | Output outb: 50
|
||||
$time: 73 | Output outa: 0 | Output outb: 50
|
||||
$time: 74 | Output outa: 0 | Output outb: 50
|
||||
$time: 75 | Output outa: 0 | Output outb: 50
|
||||
$time: 76 | Output outa: 0 | Output outb: 50
|
||||
$time: 77 | Output outa: 0 | Output outb: 50
|
||||
$time: 78 | Output outa: 0 | Output outb: 50
|
||||
$time: 79 | Output outa: 0 | Output outb: 50
|
||||
$time: 80 | Output outa: 0 | Output outb: 50
|
||||
$time: 81 | Output outa: 0 | Output outb: 50
|
||||
$time: 82 | Output outa: 0 | Output outb: 50
|
||||
$time: 83 | Output outa: 0 | Output outb: 50
|
||||
$time: 84 | Output outa: 0 | Output outb: 50
|
||||
$time: 85 | Output outa: 0 | Output outb: 50
|
||||
$time: 86 | Output outa: 0 | Output outb: 50
|
||||
$time: 87 | Output outa: 0 | Output outb: 50
|
||||
$time: 88 | Output outa: 0 | Output outb: 50
|
||||
$time: 89 | Output outa: 0 | Output outb: 50
|
||||
$time: 90 | Output outa: 0 | Output outb: 50
|
||||
$time: 91 | Output outa: 0 | Output outb: 50
|
||||
$time: 92 | Output outa: 0 | Output outb: 50
|
||||
$time: 93 | Output outa: 0 | Output outb: 50
|
||||
$time: 94 | Output outa: 0 | Output outb: 50
|
||||
$time: 95 | Output outa: 0 | Output outb: 50
|
||||
$time: 96 | Output outa: 0 | Output outb: 50
|
||||
$time: 97 | Output outa: 0 | Output outb: 50
|
||||
$time: 98 | Output outa: 0 | Output outb: 50
|
||||
$time: 99 | Output outa: 0 | Output outb: 50
|
||||
$time: 100 | Output outa: 0 | Output outb: 50
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env python3
|
||||
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||
#
|
||||
# Copyright 2025 by Wilson Snyder. This program is free software; you
|
||||
# can redistribute it and/or modify it under the terms of either the GNU
|
||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||
# Version 2.0.
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
import vltest_bootstrap
|
||||
|
||||
test.scenarios('simulator')
|
||||
test.top_filename = "t/t_instrumentation.v"
|
||||
|
||||
sim_filename = "t/" + test.name + ".cpp"
|
||||
dpi_filename = "t/t_instrumentationDPI.cpp"
|
||||
vlt_filename = "t/" + test.name + ".vlt"
|
||||
log_filename = "obj_vlt/t_instrumentation/simulation_output.log"
|
||||
|
||||
test.compile(make_top_shell=False,
|
||||
make_main=False,
|
||||
v_flags2=["--trace --exe --instrument", sim_filename, vlt_filename, dpi_filename])
|
||||
test.execute()
|
||||
|
||||
test.files_identical(log_filename, test.golden_filename)
|
||||
|
||||
test.passes()
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
// DESCRIPTION: Verilator: Verilog Test module
|
||||
//
|
||||
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||
// any use, without warranty, 2012 by Wilson Snyder.
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
module top_module(
|
||||
output logic [7:0] outa,
|
||||
output logic [7:0] outb
|
||||
);
|
||||
logic [7:0] in1a = 8'd5;
|
||||
logic [7:0] in2a = 8'd10;
|
||||
|
||||
logic [7:0] in1b = 8'd20;
|
||||
logic [7:0] in2b = 8'd30;
|
||||
|
||||
module_a a1 (.in1(in1a), .in2(in2a), .out(outa));
|
||||
module_a a2 (.in1(in1b), .in2(in2b), .out(outb));
|
||||
endmodule
|
||||
|
||||
module module_a(
|
||||
input logic [7:0] in1,
|
||||
input logic [7:0] in2,
|
||||
output logic [7:0] out
|
||||
);
|
||||
module_b b1 (.in1(in1), .in2(in2), .out(out));
|
||||
endmodule
|
||||
|
||||
module module_b (
|
||||
input logic [7:0] in1,
|
||||
input logic [7:0] in2,
|
||||
output logic [7:0] out
|
||||
);
|
||||
always_comb begin
|
||||
out = in1 + in2;
|
||||
end
|
||||
endmodule
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
// DESCRIPTION: Verilator: Verilog Test module
|
||||
//
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2025 by Wilson Snyder.
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
`verilator_config
|
||||
|
||||
instrument -model "instrument_var" -id 0 -target "top_module.a1.b1.out"
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||
//
|
||||
// DESCRIPTION: Verilator: Verilog Test module
|
||||
//
|
||||
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||
// any use, without warranty, 2025 by Wilson Snyder.
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
#include <verilated.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <svdpi.h>
|
||||
|
||||
extern "C" short instrument_var(int id, const svLogic *x) {
|
||||
switch (id)
|
||||
{
|
||||
case 0:
|
||||
return 0;
|
||||
case 1:
|
||||
// Stuck at 1 Fault Injection
|
||||
return 1;
|
||||
case 2:
|
||||
// Inverter/Bit flip Fault injection (provisional)
|
||||
return !x;
|
||||
default:
|
||||
return *x;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue