tests: Add unsupported as target type; additional tests
This commit is contained in:
parent
4a31463299
commit
5e3b0bf348
|
|
@ -117,7 +117,7 @@ if ($#opt_tests<0) {
|
||||||
mkdir "obj_dir";
|
mkdir "obj_dir";
|
||||||
|
|
||||||
our $Log_Filename = "obj_dir/driver_".strftime("%Y%m%d_%H%M%S.log", localtime);
|
our $Log_Filename = "obj_dir/driver_".strftime("%Y%m%d_%H%M%S.log", localtime);
|
||||||
my $leftcnt=0; my $okcnt=0; my $failcnt=0; my $skcnt=0;
|
my $LeftCnt=0; my $OkCnt=0; my $FailCnt=0; my $SkipCnt=0; my $UnsupCnt=0;
|
||||||
my @fails;
|
my @fails;
|
||||||
|
|
||||||
foreach my $testpl (@opt_tests) {
|
foreach my $testpl (@opt_tests) {
|
||||||
|
|
@ -134,7 +134,7 @@ $Fork->wait_all(); # Wait for all children to finish
|
||||||
sub one_test {
|
sub one_test {
|
||||||
my @params = @_;
|
my @params = @_;
|
||||||
my %params = (@params);
|
my %params = (@params);
|
||||||
$leftcnt++;
|
$LeftCnt++;
|
||||||
$Fork->schedule
|
$Fork->schedule
|
||||||
(
|
(
|
||||||
test_pl_filename => $params{pl_filename},
|
test_pl_filename => $params{pl_filename},
|
||||||
|
|
@ -150,6 +150,8 @@ sub one_test {
|
||||||
$test->oprint("Test PASSED\n");
|
$test->oprint("Test PASSED\n");
|
||||||
} elsif ($test->skips && !$test->errors) {
|
} elsif ($test->skips && !$test->errors) {
|
||||||
$test->oprint("%Skip: $test->{skips}\n");
|
$test->oprint("%Skip: $test->{skips}\n");
|
||||||
|
} elsif ($test->unsupporteds && !$test->errors) {
|
||||||
|
$test->oprint("%Unsupported: $test->{unsupporteds}\n");
|
||||||
} else {
|
} else {
|
||||||
$test->error("Missing ok\n") if !$test->errors;
|
$test->error("Missing ok\n") if !$test->errors;
|
||||||
$test->oprint("%Error: $test->{errors}\n");
|
$test->oprint("%Error: $test->{errors}\n");
|
||||||
|
|
@ -160,16 +162,18 @@ sub one_test {
|
||||||
my $test = VTest->new(@params);
|
my $test = VTest->new(@params);
|
||||||
$test->read_status;
|
$test->read_status;
|
||||||
if ($test->ok) {
|
if ($test->ok) {
|
||||||
$okcnt++;
|
$OkCnt++;
|
||||||
} elsif ($test->skips && !$test->errors) {
|
} elsif ($test->skips && !$test->errors) {
|
||||||
$skcnt++;
|
$SkipCnt++;
|
||||||
|
} elsif ($test->unsupporteds && !$test->errors) {
|
||||||
|
$UnsupCnt++;
|
||||||
} else {
|
} else {
|
||||||
$test->oprint("FAILED: ","*"x60,"\n");
|
$test->oprint("FAILED: ","*"x60,"\n");
|
||||||
push @fails, "\t#".$test->soprint("%Error: $test->{errors}\n");
|
push @fails, "\t#".$test->soprint("%Error: $test->{errors}\n");
|
||||||
my $j = ($opt_jobs>1?" -j":"");
|
my $j = ($opt_jobs>1?" -j":"");
|
||||||
push @fails, "\t\tmake$j && test_regress/"
|
push @fails, "\t\tmake$j && test_regress/"
|
||||||
.$test->{pl_filename}." ".join(' ',@Orig_ARGV_Sw)."\n";
|
.$test->{pl_filename}." ".join(' ',@Orig_ARGV_Sw)."\n";
|
||||||
$failcnt++;
|
$FailCnt++;
|
||||||
report(\@fails, $Log_Filename);
|
report(\@fails, $Log_Filename);
|
||||||
my $other = "";
|
my $other = "";
|
||||||
foreach my $proc ($Fork->running) {
|
foreach my $proc ($Fork->running) {
|
||||||
|
|
@ -178,8 +182,8 @@ sub one_test {
|
||||||
$test->oprint("Simultaneous running tests:",$other,"\n") if $other;
|
$test->oprint("Simultaneous running tests:",$other,"\n") if $other;
|
||||||
if ($opt_stop) { die "%Error: --stop and errors found\n"; }
|
if ($opt_stop) { die "%Error: --stop and errors found\n"; }
|
||||||
}
|
}
|
||||||
$leftcnt--;
|
$LeftCnt--;
|
||||||
print STDERR "==SUMMARY: Left $leftcnt Passed $okcnt Skipped $skcnt Failed $failcnt\n";
|
print STDERR "==SUMMARY: Left $LeftCnt Passed $OkCnt Unsup $UnsupCnt Skipped $SkipCnt Failed $FailCnt\n";
|
||||||
},
|
},
|
||||||
)->ready();
|
)->ready();
|
||||||
}
|
}
|
||||||
|
|
@ -187,7 +191,7 @@ sub one_test {
|
||||||
report(\@fails, undef);
|
report(\@fails, undef);
|
||||||
report(\@fails, $Log_Filename);
|
report(\@fails, $Log_Filename);
|
||||||
|
|
||||||
exit(10) if $failcnt;
|
exit(10) if $FailCnt;
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -248,13 +252,13 @@ sub report {
|
||||||
my $delta = time() - $Start;
|
my $delta = time() - $Start;
|
||||||
$fh->print("\n");
|
$fh->print("\n");
|
||||||
$fh->print("="x70,"\n");
|
$fh->print("="x70,"\n");
|
||||||
$fh->printf("TESTS Passed $okcnt Skipped $skcnt Failed $failcnt Time %d:%02d\n",
|
$fh->printf("TESTS Passed $OkCnt Unsup $UnsupCnt Skipped $SkipCnt Failed $FailCnt Time %d:%02d\n",
|
||||||
int($delta/60),$delta%60);
|
int($delta/60),$delta%60);
|
||||||
foreach my $f (@$fails) {
|
foreach my $f (@$fails) {
|
||||||
chomp $f;
|
chomp $f;
|
||||||
$fh->print("$f\n");
|
$fh->print("$f\n");
|
||||||
}
|
}
|
||||||
$fh->printf("TESTS Passed $okcnt Skipped $skcnt Failed $failcnt Time %d:%02d\n",
|
$fh->printf("TESTS Passed $OkCnt Unsup $UnsupCnt Skipped $SkipCnt Failed $FailCnt Time %d:%02d\n",
|
||||||
int($delta/60),$delta%60);
|
int($delta/60),$delta%60);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -412,6 +416,13 @@ sub skip {
|
||||||
$self->{skips} ||= "Skip: ".$msg;
|
$self->{skips} ||= "Skip: ".$msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub unsupported {
|
||||||
|
my $self = shift;
|
||||||
|
my $msg = join('',@_);
|
||||||
|
warn "%Unsupported: $self->{mode}/$self->{name}: ".$msg."\n";
|
||||||
|
$self->{unsupporteds} ||= "Unsupported: ".$msg;
|
||||||
|
}
|
||||||
|
|
||||||
sub prep {
|
sub prep {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
mkdir $self->{obj_dir}; # Ok if already exists
|
mkdir $self->{obj_dir}; # Ok if already exists
|
||||||
|
|
@ -453,7 +464,7 @@ sub read_status {
|
||||||
sub compile_vlt_flags {
|
sub compile_vlt_flags {
|
||||||
my $self = (ref $_[0]? shift : $Self);
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
my %param = (%{$self}, @_); # Default arguments are from $self
|
my %param = (%{$self}, @_); # Default arguments are from $self
|
||||||
return 1 if $self->errors || $self->skips;
|
return 1 if $self->errors || $self->skips || $self->unsupporteds;
|
||||||
|
|
||||||
my $checkflags = join(' ',@{$param{v_flags}},
|
my $checkflags = join(' ',@{$param{v_flags}},
|
||||||
@{$param{v_flags2}},
|
@{$param{v_flags2}},
|
||||||
|
|
@ -500,7 +511,7 @@ sub compile_vlt_flags {
|
||||||
sub compile {
|
sub compile {
|
||||||
my $self = (ref $_[0]? shift : $Self);
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
my %param = (%{$self}, @_); # Default arguments are from $self
|
my %param = (%{$self}, @_); # Default arguments are from $self
|
||||||
return 1 if $self->errors || $self->skips;
|
return 1 if $self->errors || $self->skips || $self->unsupporteds;
|
||||||
$self->oprint("Compile\n");
|
$self->oprint("Compile\n");
|
||||||
|
|
||||||
compile_vlt_flags(%param);
|
compile_vlt_flags(%param);
|
||||||
|
|
@ -617,7 +628,7 @@ sub compile {
|
||||||
fails=>$param{fails},
|
fails=>$param{fails},
|
||||||
expect=>$param{expect},
|
expect=>$param{expect},
|
||||||
cmd=>\@cmdargs);
|
cmd=>\@cmdargs);
|
||||||
return 1 if $self->errors || $self->skips;
|
return 1 if $self->errors || $self->skips || $self->unsupporteds;
|
||||||
|
|
||||||
if (!$param{fails} && $param{verilator_make_gcc}) {
|
if (!$param{fails} && $param{verilator_make_gcc}) {
|
||||||
if ($self->sp) {
|
if ($self->sp) {
|
||||||
|
|
@ -645,7 +656,7 @@ sub compile {
|
||||||
|
|
||||||
sub execute {
|
sub execute {
|
||||||
my $self = (ref $_[0]? shift : $Self);
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
return 1 if $self->errors || $self->skips;
|
return 1 if $self->errors || $self->skips || $self->unsupporteds;
|
||||||
my %param = (%{$self}, @_); # Default arguments are from $self
|
my %param = (%{$self}, @_); # Default arguments are from $self
|
||||||
# params may be expect or {tool}_expect
|
# params may be expect or {tool}_expect
|
||||||
$self->oprint("Run\n");
|
$self->oprint("Run\n");
|
||||||
|
|
@ -732,7 +743,7 @@ sub execute {
|
||||||
|
|
||||||
sub inline_checks {
|
sub inline_checks {
|
||||||
my $self = (ref $_[0]? shift : $Self);
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
return 1 if $self->errors || $self->skips;
|
return 1 if $self->errors || $self->skips || $self->unsupporteds;
|
||||||
return 1 if !$self->{vlt};
|
return 1 if !$self->{vlt};
|
||||||
|
|
||||||
my %param = (%{$self}, @_); # Default arguments are from $self
|
my %param = (%{$self}, @_); # Default arguments are from $self
|
||||||
|
|
@ -777,7 +788,7 @@ sub inline_checks {
|
||||||
sub ok {
|
sub ok {
|
||||||
my $self = (ref $_[0]? shift : $Self);
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
$self->{ok} = $_[0] if defined $_[0];
|
$self->{ok} = $_[0] if defined $_[0];
|
||||||
$self->{ok} = 0 if $self->{errors} || $self->{skips};
|
$self->{ok} = 0 if $self->{errors} || $self->{skips} || $self->unsupporteds;
|
||||||
return $self->{ok};
|
return $self->{ok};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -791,6 +802,11 @@ sub skips {
|
||||||
return $self->{skips};
|
return $self->{skips};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub unsupporteds {
|
||||||
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
|
return $self->{unsupporteds};
|
||||||
|
}
|
||||||
|
|
||||||
sub top_filename {
|
sub top_filename {
|
||||||
my $self = (ref $_[0]? shift : $Self);
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
$self->{top_filename} = shift if defined $_[0];
|
$self->{top_filename} = shift if defined $_[0];
|
||||||
|
|
@ -871,7 +887,7 @@ sub _run {
|
||||||
if ($param{fails} && !$status) {
|
if ($param{fails} && !$status) {
|
||||||
$self->error("Exec of $param{cmd}[0] ok, but expected to fail\n");
|
$self->error("Exec of $param{cmd}[0] ok, but expected to fail\n");
|
||||||
}
|
}
|
||||||
return if $self->errors || $self->skips;
|
return if $self->errors || $self->skips || $self->unsupporteds;
|
||||||
|
|
||||||
# Read the log file a couple of times to allow for NFS delays
|
# Read the log file a couple of times to allow for NFS delays
|
||||||
if ($param{check_finished} || $param{expect}) {
|
if ($param{check_finished} || $param{expect}) {
|
||||||
|
|
@ -1344,7 +1360,7 @@ sub file_grep_not {
|
||||||
my $self = (ref $_[0]? shift : $Self);
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
my $filename = shift;
|
my $filename = shift;
|
||||||
my $regexp = shift;
|
my $regexp = shift;
|
||||||
return if $self->errors || $self->skips;
|
return if $self->errors || $self->skips || $self->unsupporteds;
|
||||||
|
|
||||||
my $contents = $self->file_contents($filename);
|
my $contents = $self->file_contents($filename);
|
||||||
return if ($contents eq "_Already_Errored_");
|
return if ($contents eq "_Already_Errored_");
|
||||||
|
|
@ -1357,7 +1373,7 @@ sub file_grep {
|
||||||
my $self = (ref $_[0]? shift : $Self);
|
my $self = (ref $_[0]? shift : $Self);
|
||||||
my $filename = shift;
|
my $filename = shift;
|
||||||
my $regexp = shift;
|
my $regexp = shift;
|
||||||
return if $self->errors || $self->skips;
|
return if $self->errors || $self->skips || $self->unsupporteds;
|
||||||
|
|
||||||
my $contents = $self->file_contents($filename);
|
my $contents = $self->file_contents($filename);
|
||||||
return if ($contents eq "_Already_Errored_");
|
return if ($contents eq "_Already_Errored_");
|
||||||
|
|
@ -1445,7 +1461,11 @@ driver.pl - Run regression tests
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
driver.pl invokes Verilator or another simulator on each little test file.
|
driver.pl invokes Verilator or another simulator on each test file.
|
||||||
|
|
||||||
|
The driver reports the number of tests which pass, fail, skipped (some
|
||||||
|
resource required by the test is not available, such as SystemC), or are
|
||||||
|
unsupported (buggy or require a feature change before will pass.)
|
||||||
|
|
||||||
=head1 ARGUMENTS
|
=head1 ARGUMENTS
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug448");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug448");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug355");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug355");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug446");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug446");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2004 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.
|
||||||
|
|
||||||
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bind");
|
||||||
|
|
||||||
|
compile (
|
||||||
|
);
|
||||||
|
|
||||||
|
execute (
|
||||||
|
check_finished=>1,
|
||||||
|
);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2012 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t;
|
||||||
|
wire [31:0] o;
|
||||||
|
wire si = 1'b0;
|
||||||
|
|
||||||
|
ExampInst i
|
||||||
|
(// Outputs
|
||||||
|
.o (o[31:0]),
|
||||||
|
// Inputs
|
||||||
|
.i (1'b0)
|
||||||
|
/*AUTOINST*/);
|
||||||
|
|
||||||
|
Prog p (/*AUTOINST*/
|
||||||
|
// Inputs
|
||||||
|
.si (si));
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module InstModule (
|
||||||
|
output logic [31:0] so,
|
||||||
|
input si
|
||||||
|
);
|
||||||
|
assign so = {32{si}};
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
program Prog (input si);
|
||||||
|
initial begin
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
endprogram
|
||||||
|
|
||||||
|
module ExampInst (o,i);
|
||||||
|
output logic [31:0] o;
|
||||||
|
input i;
|
||||||
|
|
||||||
|
InstModule instName
|
||||||
|
(// Outputs
|
||||||
|
.so (o[31:0]),
|
||||||
|
// Inputs
|
||||||
|
.si (i)
|
||||||
|
/*AUTOINST*/);
|
||||||
|
|
||||||
|
//bind InstModule Prog instProg
|
||||||
|
// (.si(si));
|
||||||
|
|
||||||
|
// Note is based on context of caller
|
||||||
|
bind InstModule Prog instProg
|
||||||
|
(/*AUTOBIND*/
|
||||||
|
.si (si));
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug460");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug460");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/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.
|
||||||
|
|
||||||
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug470");
|
||||||
|
|
||||||
|
compile (
|
||||||
|
);
|
||||||
|
|
||||||
|
execute (
|
||||||
|
check_finished=>1,
|
||||||
|
);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2012 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOINST*/);
|
||||||
|
|
||||||
|
Test #(
|
||||||
|
.BIT_WIDTH (72),
|
||||||
|
.BYTE_WIDTH (9)
|
||||||
|
)
|
||||||
|
|
||||||
|
u_test_inst();
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module Test ();
|
||||||
|
|
||||||
|
parameter BIT_WIDTH = "";
|
||||||
|
parameter BYTE_WIDTH = "";
|
||||||
|
|
||||||
|
localparam BYTES = BIT_WIDTH / BYTE_WIDTH;
|
||||||
|
|
||||||
|
wire [BYTES - 1:0] i;
|
||||||
|
wire [BYTES - 1:0] o;
|
||||||
|
|
||||||
|
genvar g;
|
||||||
|
generate
|
||||||
|
for (g = 0; g < BYTES; g = g + 1) begin: gen
|
||||||
|
assign o[g] = (i[g] !== 1'b0);
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug408");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug408");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
v_flags2 => ["--lint-only"],
|
v_flags2 => ["--lint-only"],
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug181");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug181");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug355");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug355");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug181");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug181");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug181");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug181");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|
||||||
$Self->{vlt} and $Self->skip("Verilator unsupported, bug462");
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, bug462");
|
||||||
|
|
||||||
compile (
|
compile (
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/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.
|
||||||
|
|
||||||
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, tri");
|
||||||
|
|
||||||
|
compile (
|
||||||
|
fails=>$Self->{v3},
|
||||||
|
expect=>
|
||||||
|
'%Error: t/t_tri_bad_pull2.v:19: Unsupported: Conflicting pull directions.
|
||||||
|
%Error: t/t_tri_bad_pull2.v:9: ... Location of conflicing pull.
|
||||||
|
%Error: Exiting due to',
|
||||||
|
) if
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2010 by Lane Brooks.
|
||||||
|
|
||||||
|
module t (clk);
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
wire A;
|
||||||
|
|
||||||
|
pullup p1(A);
|
||||||
|
|
||||||
|
child child(/*AUTOINST*/
|
||||||
|
// Inouts
|
||||||
|
.A (A));
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module child(inout A);
|
||||||
|
|
||||||
|
pulldown p2(A);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/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.
|
||||||
|
|
||||||
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, tri");
|
||||||
|
|
||||||
|
compile (
|
||||||
|
fails=>$Self->{v3},
|
||||||
|
expect=>
|
||||||
|
'%Error: t/t_tri_bad_pull.v:9: Unsupported: Conflicting pull directions.
|
||||||
|
%Error: t/t_tri_bad_pull.v:10: ... Location of conflicing pull.
|
||||||
|
%Error: Exiting due to',
|
||||||
|
) if
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2010 by Lane Brooks.
|
||||||
|
|
||||||
|
module t (clk);
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
wire A;
|
||||||
|
|
||||||
|
pullup p1(A);
|
||||||
|
pulldown p2(A);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
|
||||||
|
|
||||||
|
$Self->{vlt} and $Self->unsupported("Verilator unsupported, tri");
|
||||||
|
|
||||||
|
compile (
|
||||||
|
);
|
||||||
|
|
||||||
|
execute (
|
||||||
|
check_finished=>1,
|
||||||
|
);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
||||||
|
|
@ -0,0 +1,157 @@
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2008 by Lane Brooks
|
||||||
|
|
||||||
|
module t (clk);
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
reg [31:0] state; initial state=0;
|
||||||
|
|
||||||
|
wire A = state[0];
|
||||||
|
wire OE = state[1];
|
||||||
|
wire Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8, Z9;
|
||||||
|
|
||||||
|
Test1 test1(/*AUTOINST*/
|
||||||
|
// Inouts
|
||||||
|
.Z1 (Z1),
|
||||||
|
// Inputs
|
||||||
|
.OE (OE),
|
||||||
|
.A (A));
|
||||||
|
|
||||||
|
Test2 test2(/*AUTOINST*/
|
||||||
|
// Inouts
|
||||||
|
.Z2 (Z2),
|
||||||
|
// Inputs
|
||||||
|
.OE (OE),
|
||||||
|
.A (A));
|
||||||
|
|
||||||
|
Test3 test3(/*AUTOINST*/
|
||||||
|
// Inouts
|
||||||
|
.Z3 (Z3),
|
||||||
|
// Inputs
|
||||||
|
.OE (OE),
|
||||||
|
.A (A));
|
||||||
|
|
||||||
|
Test4 test4(/*AUTOINST*/
|
||||||
|
// Outputs
|
||||||
|
.Z4 (Z4),
|
||||||
|
// Inouts
|
||||||
|
.Z5 (Z5));
|
||||||
|
|
||||||
|
Test5 test5(/*AUTOINST*/
|
||||||
|
// Inouts
|
||||||
|
.Z6 (Z6),
|
||||||
|
.Z7 (Z7),
|
||||||
|
.Z8 (Z8),
|
||||||
|
.Z9 (Z9),
|
||||||
|
// Inputs
|
||||||
|
.OE (OE));
|
||||||
|
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
state <= state + 1;
|
||||||
|
`ifdef TEST_VERBOSE
|
||||||
|
$display(" Z1=%b 2=%b 3=%b 4=%b 5=%b 6=%b 7=%b 8=%b 9=%b",Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9);
|
||||||
|
`endif
|
||||||
|
|
||||||
|
if(state == 0) begin
|
||||||
|
if(Z1 !== 1'b1) $stop; // tests pullups
|
||||||
|
if(Z2 !== 1'b1) $stop;
|
||||||
|
if(Z3 !== 1'b1) $stop;
|
||||||
|
if(Z4 !== 1'b1) $stop;
|
||||||
|
if(Z5 !== 1'b1) $stop;
|
||||||
|
if(Z6 !== 1'b1) $stop;
|
||||||
|
if(Z7 !== 1'b0) $stop;
|
||||||
|
if(Z8 !== 1'b0) $stop;
|
||||||
|
if(Z9 !== 1'b1) $stop;
|
||||||
|
end
|
||||||
|
else if(state == 1) begin
|
||||||
|
if(Z1 !== 1'b1) $stop; // tests pullup
|
||||||
|
if(Z2 !== 1'b1) $stop;
|
||||||
|
if(Z3 !== 1'b1) $stop;
|
||||||
|
if(Z4 !== 1'b1) $stop;
|
||||||
|
if(Z5 !== 1'b1) $stop;
|
||||||
|
if(Z6 !== 1'b1) $stop;
|
||||||
|
if(Z7 !== 1'b0) $stop;
|
||||||
|
if(Z8 !== 1'b0) $stop;
|
||||||
|
if(Z9 !== 1'b1) $stop;
|
||||||
|
end
|
||||||
|
else if(state == 2) begin
|
||||||
|
if(Z1 !== 1'b0) $stop; // tests output driver low
|
||||||
|
if(Z2 !== 1'b0) $stop;
|
||||||
|
//if(Z3 !== 1'b1) $stop; // "X"
|
||||||
|
if(Z4 !== 1'b1) $stop;
|
||||||
|
if(Z5 !== 1'b1) $stop;
|
||||||
|
if(Z6 !== 1'b0) $stop;
|
||||||
|
if(Z7 !== 1'b1) $stop;
|
||||||
|
if(Z8 !== 1'b1) $stop;
|
||||||
|
if(Z9 !== 1'b0) $stop;
|
||||||
|
end
|
||||||
|
else if(state == 3) begin
|
||||||
|
if(Z1 !== 1'b1) $stop; // tests output driver high
|
||||||
|
if(Z2 !== 1'b1) $stop;
|
||||||
|
if(Z3 !== 1'b1) $stop;
|
||||||
|
if(Z4 !== 1'b1) $stop;
|
||||||
|
if(Z5 !== 1'b1) $stop;
|
||||||
|
if(Z6 !== 1'b0) $stop;
|
||||||
|
if(Z7 !== 1'b1) $stop;
|
||||||
|
if(Z8 !== 1'b1) $stop;
|
||||||
|
if(Z9 !== 1'b0) $stop;
|
||||||
|
end
|
||||||
|
else if(state == 4) begin
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
pullup(Z1);
|
||||||
|
pullup(Z2);
|
||||||
|
pullup(Z3);
|
||||||
|
pullup(Z4);
|
||||||
|
pullup(Z5);
|
||||||
|
pullup(Z6);
|
||||||
|
pulldown(Z7);
|
||||||
|
pullup(Z8);
|
||||||
|
pulldown(Z9);
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
module Test1(input OE, input A, inout Z1);
|
||||||
|
assign Z1 = (OE) ? A : 1'bz;
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module Test2(input OE, input A, inout Z2);
|
||||||
|
assign Z2 = (OE) ? A : 1'bz;
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// mixed low-Z and tristate
|
||||||
|
module Test3(input OE, input A, inout Z3);
|
||||||
|
assign Z3 = (OE) ? A : 1'bz;
|
||||||
|
assign Z3 = 1'b1;
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// floating output and inout
|
||||||
|
module Test4(output Z4, inout Z5);
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// AND gate tristates
|
||||||
|
module Test5(input OE, inout Z6, inout Z7, inout Z8, inout Z9);
|
||||||
|
assign Z6 = (OE) ? 1'b0 : 1'bz;
|
||||||
|
assign Z7 = (OE) ? 1'b1 : 1'bz;
|
||||||
|
assign Z8 = (OE) ? 1'bz : 1'b0;
|
||||||
|
assign Z9 = (OE) ? 1'bz : 1'b1;
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// This is not implemented yet
|
||||||
|
//module Test3(input OE, input A, inout Z3);
|
||||||
|
// always @(*) begin
|
||||||
|
// if(OE) begin
|
||||||
|
// Z3 = A;
|
||||||
|
// end else begin
|
||||||
|
// Z3 = 1'bz;
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
//endmodule
|
||||||
|
|
||||||
Loading…
Reference in New Issue