Tests: Improve internal coverage holes
This commit is contained in:
parent
66d70c8b37
commit
e202a6324a
|
|
@ -0,0 +1,44 @@
|
||||||
|
// -*- 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, 2010 by Wilson Snyder.
|
||||||
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
|
#include <verilated.h>
|
||||||
|
#include VM_PREFIX_INCLUDE
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
#include "Vt_dpi_export_scope_bad__Dpi.h"
|
||||||
|
|
||||||
|
#ifdef NEED_EXTERNS
|
||||||
|
extern "C" {
|
||||||
|
extern void dpix_task();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
unsigned int main_time = 0;
|
||||||
|
|
||||||
|
double sc_time_stamp() { return main_time; }
|
||||||
|
|
||||||
|
VM_PREFIX* topp = nullptr;
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
topp = new VM_PREFIX;
|
||||||
|
|
||||||
|
Verilated::debug(0);
|
||||||
|
|
||||||
|
topp->eval();
|
||||||
|
|
||||||
|
topp->final();
|
||||||
|
VL_DO_DANGLING(delete topp, topp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dpix_run_tests() {
|
||||||
|
dpix_task(); // Wrong scope
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
%Error: unknown:0: Testbench C called 'dpix_task' but this DPI export function exists only in other scopes, not scope 'TOP.t'
|
||||||
|
Aborting...
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2003 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
|
||||||
|
|
||||||
|
scenarios(simulator => 1);
|
||||||
|
|
||||||
|
compile(
|
||||||
|
v_flags2 => ["--exe $Self->{t_dir}/$Self->{name}.cpp"],
|
||||||
|
make_main => 0,
|
||||||
|
);
|
||||||
|
|
||||||
|
execute(
|
||||||
|
fails => 1,
|
||||||
|
expect_filename => $Self->{golden_filename},
|
||||||
|
);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// Copyright 2020 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
|
||||||
|
|
||||||
|
module t;
|
||||||
|
s s();
|
||||||
|
|
||||||
|
import "DPI-C" context function void dpix_run_tests();
|
||||||
|
initial dpix_run_tests();
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module s;
|
||||||
|
export "DPI-C" task dpix_task;
|
||||||
|
task dpix_task();
|
||||||
|
$write("Hello in %m\n");
|
||||||
|
endtask
|
||||||
|
endmodule
|
||||||
|
|
@ -11,11 +11,14 @@
|
||||||
|
|
||||||
#include <verilated.h>
|
#include <verilated.h>
|
||||||
#include <verilated_cov.h>
|
#include <verilated_cov.h>
|
||||||
|
#include "TestCheck.h"
|
||||||
|
|
||||||
#include VM_PREFIX_INCLUDE
|
#include VM_PREFIX_INCLUDE
|
||||||
|
|
||||||
double sc_time_stamp() { return 0; }
|
double sc_time_stamp() { return 0; }
|
||||||
|
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
VerilatedMutex outputMutex;
|
VerilatedMutex outputMutex;
|
||||||
|
|
||||||
#ifdef T_WRAPPER_CONTEXT
|
#ifdef T_WRAPPER_CONTEXT
|
||||||
|
|
@ -89,6 +92,14 @@ int main(int argc, char** argv, char** env) {
|
||||||
context0p->traceEverOn(true);
|
context0p->traceEverOn(true);
|
||||||
context1p->traceEverOn(true);
|
context1p->traceEverOn(true);
|
||||||
|
|
||||||
|
// error number checks
|
||||||
|
TEST_CHECK_EQ(context0p->errorCount(), 0);
|
||||||
|
TEST_CHECK_EQ(context1p->errorCount(), 0);
|
||||||
|
context0p->errorCount(1);
|
||||||
|
TEST_CHECK_EQ(context0p->errorCount(), 1);
|
||||||
|
context0p->errorCount(0);
|
||||||
|
TEST_CHECK_EQ(context0p->errorCount(), 0);
|
||||||
|
|
||||||
// instantiate verilated design
|
// instantiate verilated design
|
||||||
std::unique_ptr<VM_PREFIX> top0p{new VM_PREFIX{context0p.get(), "top0"}};
|
std::unique_ptr<VM_PREFIX> top0p{new VM_PREFIX{context0p.get(), "top0"}};
|
||||||
std::unique_ptr<VM_PREFIX> top1p{new VM_PREFIX{context1p.get(), "top1"}};
|
std::unique_ptr<VM_PREFIX> top1p{new VM_PREFIX{context1p.get(), "top1"}};
|
||||||
|
|
@ -108,7 +119,10 @@ int main(int argc, char** argv, char** env) {
|
||||||
|
|
||||||
// check if both finished
|
// check if both finished
|
||||||
bool pass = true;
|
bool pass = true;
|
||||||
if (top0p->done_o && top1p->done_o) {
|
if (errors) {
|
||||||
|
std::cout << "Error: comparison errors" << std::endl;
|
||||||
|
pass = false;
|
||||||
|
} else if (top0p->done_o && top1p->done_o) {
|
||||||
std::cout << "*-* All Finished *-*" << std::endl;
|
std::cout << "*-* All Finished *-*" << std::endl;
|
||||||
} else {
|
} else {
|
||||||
std::cout << "Error: Early termination!" << std::endl;
|
std::cout << "Error: Early termination!" << std::endl;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue