1
0
mirror of https://github.com/wfjm/w11.git synced 2026-01-18 17:37:09 +00:00

update xviv_msg_filter

- add c type rules for 'count-only' filters
- add support for bitstream generation checking ([bit] section)
- update vmfsets
This commit is contained in:
wfjm 2018-12-26 09:40:03 +01:00
parent a73bda34de
commit 89732fe3e0
9 changed files with 183 additions and 72 deletions

View File

@ -85,7 +85,10 @@ The full set of tests is only run for tagged releases.
- tbcore_rlink: wait 40 cycles after CONF_DONE
- serport_master_tb: add 100 ps RXSD,TXSD delay to allow clock jitter
- tools changes
- xviv_msg_filter: display INFO Common 17-14 'further message disabled'
- xviv_msg_filter
- display INFO Common 17-14 'further message disabled'
- add c type rules for 'count-only' filters
- add support for bitstream generation checking ([bit] section)
- tbrun: add --all option
- (all perl scripts): add and use bailout instead of die
- viv_tools_build.tcl: increase message limits (all 200, some 5000)

View File

@ -1,10 +1,11 @@
# $Id: generic_vivado.mk 830 2016-12-26 20:25:49Z mueller $
# $Id: generic_vivado.mk 1091 2018-12-23 12:38:29Z mueller $
#
# Copyright 2015-2016 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2015-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# License disclaimer see License.txt in $RETROBASE directory
#
# Revision History:
# Date Rev Version Comment
# 2018-12-22 1091 1.4.2 add bitgen flow checking
# 2016-08-27 802 1.4.1 viv_clean: rm only vivado logs
# 2016-07-22 792 1.4 relocate viv tcl code to tools/vivado
# 2016-06-24 778 1.3 add rsim.vhd and [sorep]sim.v targets
@ -76,10 +77,14 @@ endif
@ if [ -r $*_syn.log ]; \
then xviv_msg_filter syn $*.vmfset $*_syn.log; \
else echo " !!! no $*_syn.log found"; fi
@ echo "=== Implementation flow summary=============================="
@ echo "=== Implementation flow summary ============================="
@ if [ -r $*_imp.log ]; \
then xviv_msg_filter imp $*.vmfset $*_imp.log; \
else echo " !!! no $*_imp.log found"; fi
@ echo "=== Bitgen flow summary ====================================="
@ if [ -r $*_bit.log ]; \
then xviv_msg_filter bit $*.vmfset $*_bit.log; \
else echo " !!! no $*_bit.log found"; fi
#
# Configure FPGA with vivado hardware server
# input: %.bit

View File

@ -1,4 +1,4 @@
# $Id: sys_w11a_br_arty.vmfset 1073 2018-11-23 18:05:51Z mueller $
# $Id: sys_w11a_br_arty.vmfset 1091 2018-12-23 12:38:29Z mueller $
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[syn]
@ -190,3 +190,9 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
[imp]
I [Vivado 12-2489] # multiple of 1 ps
I [Physopt 32-742] # BRAM Flop Optimization
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[bit]
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
i [DRC DPOP-1] PREG Output pipelining
i [DRC DPOP-2] MREG Output pipelining

View File

@ -1,4 +1,4 @@
# $Id: sys_w11a_br_as7.vmfset 1073 2018-11-23 18:05:51Z mueller $
# $Id: sys_w11a_br_as7.vmfset 1091 2018-12-23 12:38:29Z mueller $
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[syn]
@ -121,3 +121,10 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
[imp]
I [Vivado 12-2489] # multiple of 1 ps
I [Physopt 32-742] # BRAM Flop Optimization
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[bit]
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
# indicated everywhere, but not in as7 ??
#i [DRC DPOP-1] PREG Output pipelining
#i [DRC DPOP-2] MREG Output pipelining

View File

@ -1,4 +1,4 @@
# $Id: sys_w11a_b3.vmfset 1073 2018-11-23 18:05:51Z mueller $
# $Id: sys_w11a_b3.vmfset 1091 2018-12-23 12:38:29Z mueller $
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[syn]
@ -140,3 +140,9 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
[imp]
I [Vivado 12-2489] # multiple of 1 ps
I [Physopt 32-742] # BRAM Flop Optimization
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[bit]
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
i [DRC DPOP-1] PREG Output pipelining
i [DRC DPOP-2] MREG Output pipelining

View File

@ -1,4 +1,4 @@
# $Id: sys_w11a_c7.vmfset 1073 2018-11-23 18:05:51Z mueller $
# $Id: sys_w11a_c7.vmfset 1091 2018-12-23 12:38:29Z mueller $
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[syn]
@ -32,6 +32,8 @@ I [Synth 8-3331] DM_STAT_SE # generic
I [Synth 8-3331] DM_STAT_VM # generic
I [Synth 8-3331] CP_STAT # generic
I [Synth 8-3331] SER_MONI # generic
# --> I_BTN not used # OK 2018-12-22
i [Synth 8-3331] I_BTN[\d]
# --> ireg indeed not fully used # OK 2018-11-18
i [Synth 8-3331] pdp11_sequencer .* IREG[1(1|2|3|4)]
# --> ccin indedd not fully used # OK 2018-11-18
@ -152,3 +154,9 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
[imp]
I [Vivado 12-2489] # multiple of 1 ps
I [Physopt 32-742] # BRAM Flop Optimization
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[bit]
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
i [DRC DPOP-1] PREG Output pipelining
i [DRC DPOP-2] MREG Output pipelining

View File

@ -1,4 +1,4 @@
# $Id: sys_w11a_n4.vmfset 1073 2018-11-23 18:05:51Z mueller $
# $Id: sys_w11a_n4.vmfset 1091 2018-12-23 12:38:29Z mueller $
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[syn]
@ -144,3 +144,9 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
[imp]
I [Vivado 12-2489] # multiple of 1 ps
I [Physopt 32-742] # BRAM Flop Optimization
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[bit]
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
i [DRC DPOP-1] PREG Output pipelining
i [DRC DPOP-2] MREG Output pipelining

View File

@ -1,5 +1,5 @@
#!/usr/bin/perl -w
# $Id: xviv_msg_filter 1072 2018-11-18 22:27:35Z mueller $
# $Id: xviv_msg_filter 1091 2018-12-23 12:38:29Z mueller $
#
# Copyright 2016-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
@ -14,6 +14,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2018-12-22 1091 1.1.3 add count-only rules; add -pcnt; add [bit] handling
# 2018-11-18 1072 1.1.2 display INFO Common 17-14 'further message disabled'
# 2018-08-11 1039 1.1.1 allow {yyyy.x} tags (in addition to ranges)
# 2017-06-06 909 1.1 add version-range tags
@ -28,23 +29,25 @@ use Getopt::Long;
my %opts = ();
GetOptions(\%opts, "help", "pacc") || exit 1;
sub print_help;
sub read_mfs;
sub read_log;
GetOptions(\%opts, "help", "pacc", "pcnt")
or bailout("bad command options");
my $type = shift @ARGV;
my $mfsnam = shift @ARGV;
my $lognam = shift @ARGV;
my %finfokill;
my @flist;
my @mlist;
my %msgcnt;
my %msgsev;
my $nackcnt = 0;
my $ackcnt = 0;
my $imisscnt = 0;
my $rmisscnt = 0;
my $cntcnt = 0;
my $timebad = 0;
my $timegood = 0;
my $bitgood = 0;
my $vercur;
my $vermin = "0000.0";
@ -55,19 +58,16 @@ my $retrobase = $ENV{RETROBASE};
autoflush STDOUT 1 if (-p STDOUT); # autoflush if output into pipe
if (exists $opts{help}) {
print_help;
print_help();
exit 0;
}
if (!defined $type || !defined $mfsnam || !defined $lognam) {
print STDERR "xviv_msg_filter-E: one of 'type mfset log' missing \n\n";
print_help;
exit 1;
bailout("one of 'type mfset log' missing");
}
if ($type !~ m{^(syn|imp)$}) {
print STDERR "xviv_msg_filter-E: type must be syn or imp\n";
exit 1;
if ($type !~ m{^(syn|imp|bit)$}) {
bailout("type must be syn, imp or bit");
}
if (read_ver($lognam)) {exit 1;}
@ -75,41 +75,50 @@ if (read_mfs($mfsnam)) {exit 1;}
if (read_log($lognam)) {exit 1;}
foreach my $m (@mlist) {
my $msev = $m->[0];
my $mcode = $m->[1];
my $mtext = $m->[2];
my $msgmatch = 0;
# check for timing closure
# bad: [Route 35-39] The design did not meet timing requirements
# bad: [Timing 38-282] The design failed to meet the timing ...
# good: [Route 35-61] The design met the timing requirement
$timebad += 1 if $type eq 'imp' && $mcode eq 'Route 35-39';
$timebad += 1 if $type eq 'imp' && $mcode eq 'Timing 38-282';
$timegood += 1 if $type eq 'imp' && $mcode eq 'Route 35-61';
# bad: [Route 35-39] The design did not meet timing requirements
# bad: [Timing 38-282] The design failed to meet the timing ...
# good: [Route 35-61] The design met the timing requirement
$timebad += 1 if $type eq 'imp' && $$m{code} eq 'Route 35-39';
$timebad += 1 if $type eq 'imp' && $$m{code} eq 'Timing 38-282';
$timegood += 1 if $type eq 'imp' && $$m{code} eq 'Route 35-61';
# check for proper bitstream generation
# good: [Vivado 12-1842] Bitgen Completed Successfully
$bitgood += 1 if $type eq 'bit' && $$m{code} eq 'Vivado 12-1842';
foreach my $f (@flist) {
my $fmode = $f->[0];
my $fcode = $f->[1];
my $frege = $f->[2];
if ($frege eq '') {
$msgmatch = $mcode eq $fcode;
if ($$f{rege} eq '') {
$msgmatch = $$m{code} eq $$f{code};
} else {
$msgmatch = $mcode eq $fcode && $mtext =~ m{$frege};
$msgmatch = $$m{code} eq $$f{code} && $$m{text} =~ m{$$f{rege}};
}
if ($msgmatch) {
#print "+++m '$fmode' '$fcode' '$frege' : '$mcode' '$mtext'\n";
$f->[3] += 1;
$$f{cnt} += 1;
last;
}
}
if ($mcode ne 'Common 17-14' && $msev eq 'INFO') {
$msgmatch = 1; # accept all INFO except 'further msg disabled'
# accept all INFO except 'further msg disabled'
# show 'further msg disabled' only
# if the code is not an INFO messages
# if the code is not covered by a 'I' rule
if ($$m{sev} eq 'INFO') {
if ($$m{code} eq 'Common 17-14') {
if ($$m{text} =~ m/Message '(.*?)' appears/) {
my $code = $1;
$msgmatch = 1 if exists $msgsev{$code} && $msgsev{$code} eq 'INFO';
$msgmatch = 1 if $finfokill{$code};
}
} else {
$msgmatch = 1;
}
}
if ($msgmatch) {
$m->[3] += 1;
$$m{cnt} += 1;
} else {
$nackcnt += 1;
}
@ -118,16 +127,16 @@ foreach my $m (@mlist) {
if ($nackcnt) {
print "Unexpected messages of type [$type] from $lognam:\n";
foreach my $m (@mlist) {
next if $m->[3];
next if $$m{cnt};
# now prety print the message
# remove $RETROBASE from file names
my $mtext = $m->[2];
my $mtext = $$m{text};
$mtext =~ s/${retrobase}/.../g if defined $retrobase;
# and break it up into 80 character wide lines
my @mwl = split /\s+/,$mtext;
unshift @mwl, '[' . $m->[1] . ']';
unshift @mwl, $m->[0] . ':';
unshift @mwl, '[' . $$m{code} . ']';
unshift @mwl, $$m{sev} . ':';
my $pref = ' ';
my $line = ' ';
while (scalar(@mwl)) {
@ -144,13 +153,15 @@ if ($nackcnt) {
}
foreach my $f (@flist) {
if ($f->[3] != 0) { # matches seen
if ($$f{cnt} != 0) { # matches seen
$ackcnt += 1;
} else { # matches not seen
if ($f->[0] eq 'i') { # complain if 'i'
} else { # matches not seen
if ($$f{mode} eq 'i') { # complain if 'i'
$imisscnt += 1;
} elsif ($f->[0] eq 'r') { # complain if 'r'
} elsif ($$f{mode} eq 'r') { # complain if 'r'
$rmisscnt += 1;
} elsif ($$f{mode} eq 'c') { # show count if 'c'
$cntcnt += 1;
}
}
}
@ -158,8 +169,17 @@ foreach my $f (@flist) {
if ($ackcnt && exists $opts{pacc}) {
print "Accepted messages for type [$type] from $lognam:\n";
foreach my $f (@flist) {
next if $f->[3] == 0;
printf "%4d: [%s] %s\n", $f->[3], $f->[1], $f->[2];
next if $$f{cnt} == 0;
printf "%4d: [%s] %s\n", $$f{cnt}, $$f{code}, $$f{rege};
}
print "\n";
}
if ($cntcnt) {
print "Count-only filter rules for $lognam:\n";
foreach my $f (@flist) {
printf "%4d: [%s] %s\n", $$f{cnt}, $$f{code}, $$f{rege}
if $$f{mode} eq 'c';
}
print "\n";
}
@ -167,8 +187,8 @@ if ($ackcnt && exists $opts{pacc}) {
if ($imisscnt) {
print "Ignore filter rules with no matches for type [$type] from $lognam:\n";
foreach my $f (@flist) {
next if $f->[3] != 0;
printf "%4d: [%s] %s\n", $f->[3], $f->[1], $f->[2] if $f->[0] eq 'i';
next if $$f{cnt} != 0;
printf "%4d: [%s] %s\n", $$f{cnt}, $$f{code}, $$f{rege} if $$f{mode} eq 'i';
}
print "\n";
}
@ -176,8 +196,16 @@ if ($imisscnt) {
if ($rmisscnt) {
print "Missed required messages for type [$type] from $lognam:\n";
foreach my $f (@flist) {
next if $f->[3] != 0;
printf "%4d: [%s] %s\n", $f->[3], $f->[1], $f->[2] if $f->[0] eq 'r';
next if $$f{cnt} != 0;
printf "%4d: [%s] %s\n", $$f{cnt}, $$f{code}, $$f{rege} if $$f{mode} eq 'r';
}
print "\n";
}
if ($opts{pcnt}) {
print "Message statistics:\n";
foreach my $code (sort keys %msgcnt) {
printf "%4d %s : %s\n", $msgcnt{$code}, $code, $msgsev{$code};
}
print "\n";
}
@ -187,18 +215,23 @@ if ($type eq 'imp' && ($timebad > 0 || $timegood == 0)) {
printf "!! FAILED TO REACH TIMING CLOSURE !!\n";
printf "!! ------------------------------ !!\n";
}
if ($type eq 'bit' && $bitgood == 0) {
printf "!! --------------------------- !!\n";
printf "!! FAILED TO CREATE BIT STREAM !!\n";
printf "!! --------------------------- !!\n";
}
#-------------------------------------------------------------------------------
sub read_mfs {
my ($fname) = @_;
if (not -r $fname) {
print STDERR "xviv_msg_filter-E: \'$fname\' not existing or readable\n";
print STDERR "xviv_msg_filter-E: '$fname' not existing or readable\n";
return 1;
}
my $fh = new FileHandle;
$fh->open($fname) or die "can't open for read $fname: $!";
$fh->open($fname) or bailout("can't open for read '$fname': $!");
my $intyp = 0;
@ -241,14 +274,18 @@ sub read_mfs {
next if $vercur lt $vermin || $vercur gt $vermax;
if (/^([iIr])\s+\[(.+?)\]\s*(.*)\s*$/) {
if (/^([iIrc])\s+\[(.+?)\]\s*(.*)\s*$/) {
#print "+++0m '$1' '$2' '$3'\n";
my $fmode = $1;
my $fcode = $2;
my $frege = $3;
$frege =~ s/\[/\\\[/g;
$frege =~ s/\]/\\\]/g;
push @flist, [$fmode,$fcode,$frege, 0];
push @flist, {mode => $fmode,
code => $fcode,
rege => $frege,
cnt => 0};
$finfokill{$fcode} += 1 if $fmode eq 'I';
} else {
printf STDERR "xviv_msg_filter-E: bad line in mfset: '%s'\n", $_;
}
@ -268,13 +305,25 @@ sub read_log {
return 1;
}
open (LFILE, $fname) or die "can't open for read $fname: $!";
open (LFILE, $fname) or bailout("can't open for read '$fname': $!");
my $skip = $type eq 'bit'; # enable skip for bit
while (<LFILE>) {
chomp;
if ($type eq 'bit') {
$skip = 0 if m/INFO: \[Common 17-206\] Exiting Vivado/;
next if $skip;
}
if (m{^(INFO|WARNING|CRITICAL WARNING|ERROR):\s*\[(.+?)\]\s*(.*)}) {
#print "+++0l '$1' '$2' '$3'\n";
push @mlist, [$1,$2,$3,0];
# print "+++0l '$1' '$2' '$3'\n";
push @mlist, {sev => $1,
code => $2,
text => $3,
cnt => 0};
$msgcnt{"$2"} += 1; # message counter
$msgsev{"$2"} = $1; # message severity tracking
}
}
@ -292,7 +341,7 @@ sub read_ver {
return 1;
}
open (LFILE, $fname) or die "can't open for read $fname: $!";
open (LFILE, $fname) or bailout("can't open for read '$fname': $!");
my $nline = 0;
while (<LFILE>) {
@ -312,12 +361,21 @@ sub read_ver {
#-------------------------------------------------------------------------------
sub bailout {
my ($msg) = @_;
print STDERR "xviv_msg_filter-F: $msg\n";
exit 1;
}
#-------------------------------------------------------------------------------
sub print_help {
print "usage: xviv_msg_filter [options] type mfset log\n";
print " type log file type: syn or imp\n";
print " type log file type: syn, imp or bit\n";
print " mfset message filter set file\n";
print " log log file\n";
print " Options:\n";
print " --pacc print summary of accepted messages\n";
print " --pcnt print message counts\n";
print " --help this message\n";
}

View File

@ -1,10 +1,10 @@
.\" -*- nroff -*-
.\" $Id: xviv_msg_filter.1 909 2017-06-09 16:21:55Z mueller $
.\" $Id: xviv_msg_filter.1 1093 2018-12-25 19:52:53Z mueller $
.\"
.\" Copyright 2016- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
.\" Copyright 2016-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
.\"
.\" ------------------------------------------------------------------
.TH XVIV_MSG_FILTER 1 2017-06-06 "Retro Project" "Retro Project Manual"
.TH XVIV_MSG_FILTER 1 2018-12-24 "Retro Project" "Retro Project Manual"
.\" ------------------------------------------------------------------
.SH NAME
xviv_msg_filter \- message filter for Xilinx Vivado tool chain log files
@ -12,7 +12,7 @@ xviv_msg_filter \- message filter for Xilinx Vivado tool chain log files
.SH SYNOPSIS
.
.SY xviv_msg_filter
.OP \-\-pack
.RI [ OPTION ]...
.I TYPE
.I VMFSET
.I LOGFILE
@ -43,6 +43,8 @@ The accepted values for \fITYPE\fP are:
Vivado synthesis flow
.IP \fBimp\fP
Vivado implementation flow
.IP \fBbit\fP
Vivado bitfile generation step
.PD
.RE
.
@ -53,6 +55,9 @@ Vivado implementation flow
Print a summary of all accepted messages. The match count for each rule is
listed.
.
.IP \fB\-\-pcnt\fP
Print a statistics of all detected messages.
.
.\" ----------------------------------------------
.IP \fB\-\-help\fP
print full help.
@ -73,7 +78,7 @@ A line of the form
{yyyy.n:}
{:}
.EE
acts as version range tag and specifies a range of vivado versions for which the
acts as version range tag and specifies a range of Vivado versions for which the
following rules shall be applied.
"{:2016.4}" means up to version 2016.4, "{:2017.1}" from 2017.1 on, while
"{:}" cancels version range checking.
@ -95,17 +100,20 @@ determines how the rule is applied
matching messages are ignored
.IP \fBi\fP 4
matching messages are not printed, if no matching message is found a
notifivation is printed.
notification is printed.
.IP \fBc\fP 4
matching messages are counted, only a summary of the message counts is
printed.
.IP \fBr\fP 4
signals that at least one matching message is required, if none seen, a
notifivation is printed.
notification is printed.
.PD
.RE
.IP \fBname\fP
Vivado message name, enclosed in [] brackets
.IP \fBpattern\fP
regular expression to match the message text. This field is optional, if
omitted all messages with th given name will match. '[' and ']' characters
omitted all messages with the given name will match. '[' and ']' characters
are escaped to '\\[' and '\\]', because [] is very often part of signal
names. Character set matches are therefore not possible, unfortunately.
@ -120,6 +128,10 @@ names. Character set matches are therefore not possible, unfortunately.
# -----------
[imp]
I [Vivado 12-2489] # multiple of 1 ps
# -----------
[bit]
i [DRC DPOP-1] PREG Output pipelining
i [DRC DPOP-2] MREG Output pipelining
.EE
.\" ------------------------------------------------------------------
.SH EXIT STATUS