##################################################################
# Copyright (C) 2000 Greg London All Rights Reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
##################################################################
Hardware::Verilog::Parse.pm is currently in "beta" status
The Hardware::Verilog::Parser.pm file contains a Verilog grammar.
This grammar is used by Parse::RecDescent to parse any
Verilog design file. The parser was developed with version
1.77 of Parse::RecDescent.
parser.pl is a script which uses this module to do the actual parsing.
a test Verilog file is included called test1.v
to parse the file, type:
parser.pl test1.v
(or "parser.pl test1.v test2.v test3.v")
This should print out a report on test1.v that looks something like this:
module testmodule
contained the following input ports:
clock
myin
reset_n
contained the following inout ports:
contained the following output ports:
myout
outwire
contained the following wires:
type wire clock
type wire myin
type wire mywire
type wire outwire
type wire reset_n
contained the following regs:
myout
temp_reg1 [ 23 : 0 ]
temp_reg2 [ 35 : 0 ]
contained the following instances:
c is instance of clkblk
c1 is instance of clkbufrd
u2 is instance of core
u3 is instance of and08
u4 is instance of or02
contained the following function declarations :
contained the following parameters :
line count is 677
timit result is 58 wallclock secs (58.05 usr + 0.06 sys = 58.11 CPU)
using 58.05 seconds parse time
parse_rate is 11.66 lines/sec ( 677 / 58.05 ) src/test2.v
=========================================================
parser.pl will generate a similar report for all
modules it encounters in the files it is given.
a sample parser.pl file could look like this:
#! /bin/perl -sw
use Hardware::Verilog::Parser;
$parse = new Hardware::Verilog::Parser;
$parse->SearchPath(
'./',
'./include/'
);
$parse->Filename(@ARGV);
This will parse all the files passed as command line parameters.
Note, it also sets a "search path" which gives the parser a list
of paths to search for the given filenames.
If no search path is specified, files are assumed to be at ./
If search path is specified, and you want to start searching at ./
then you need to explicitly specify this.
=========================================================
The parser is now precompiled, and runs much faster than
the previous versions. Without precompilation, it took
about 60 seconds to run, with precompilation, it takes
roughly 6 seconds. An order of magnitude improvement.
you'll notice the report above lists performance numbers,
and they aren't exactly impressive.
currently, benchmarks average about 20 lines of Verilog
code parsed per second. So, yes, its still slow.
Damian has promised me the next version (2.0) of
Parse::RecDescent will have about a 5x speed improvement.
Unfortunately, it may be a couple months before its
released.
given its slow speed, the parser would be useful for
applications that can be run overnight, such as checking
coding rules on all the verilog currently checked into RCS.
I would eventually like to be able to detect signals
that can be categorized as asyncronous, syncronous,
clocks, registered output, gated outputs, and use that
information to automatically generate synthesis scripts,
and flag problem areas, such as combinatorial paths
that cross multiple hierarchy boundaries, and the like.
=========================================================
Directory structure / installation information:
once you untarred the file, you can install
the files by creating a directory structure
similar to this:
~home/Hardware/Verilog
inside that directory, copy the following files:
Hierarchy.pm
Parser.pm
StdLogic.pm
The remaining files go into ~home.
This would be where you run your perl scripts from.
You will need to run the perl script:
generate_precompiled_parser.pl
to generate the file PrecompiledParser.pm
this also goes into ~home
(or whatever directory you are running your perl
scripts from)
If you have any corrections or questions,
please send them to me at
greg42@bellatlantic.net
thanks,
Greg London