Verilogインスタンス記述生成スクリプト

VerilogPerlを利用した、RTLのインスタンス記述生成スクリプトです。

RTLを引数で読めば、標準出力にインスタンス記述を出力します。

※日本語VerilogPerlの某有名ページを参考にさせて頂きました。


#!/usr/bin/perl -w

use strict;
use warnings;
use Getopt::Std;
use Verilog::Netlist;

my %opt = ();
getopts("hif", \%opt);
if ($opt{h}) { &help(); }
if ($opt{i}) { &MkInst(); }
if ($opt{f}) { &MkIOInfo(); }

sub help()
{
print << "ENDLINE";
Usage: ${0} [Optin]
Option:
-h :help
-i rtl :making instance
-f rtl :making i/o information
ENDLINE
}

sub MkInst {
my @FileList = @ARGV;

my $NetList = new Verilog::Netlist;
&ReadVerilogFiles($NetList, \@FileList);

&PrintInstance($NetList);
}

sub MkIOInfo {
my @FileList = @ARGV;

my $NetList = new Verilog::Netlist;
&ReadVerilogFiles($NetList, \@FileList);

&PrintIOInfo($NetList);
}

sub ReadVerilogFiles {
my ($netlist, $r_filelist) = @_;

foreach my $file (@{$r_filelist}) {
$netlist->read_file(filename=>$file);
}

$netlist->link(); # connection resolve
}

sub PrintInstance {
my ($netlist) = @_;

foreach my $module ($netlist->modules_sorted) {
my @ports = $module->ports_ordered;
if ($#ports == -1) { next; }

print ' 'x4, $module->name,' ', $module->name, "_0 (\n";

my $max = 0;
for (my $index=0; $index <= $#ports; $index++) {
my $size = length($ports[$index]->name);
if ($max < $size) { $max = $size; }
}

for (my $index=0; $index <= $#ports; $index++) {
print ' 'x8, '.', $ports[$index]->name, ' 'x($max-length($ports[$index]->name));
print '(', $ports[$index]->name, ' 'x($max-length($ports[$index]->name)), ')';
if ($index != $#ports) {
print ",";
} else {
print " ";
}
print " // ", $ports[$index]->direction;
if (defined($ports[$index]->net->width) && $ports[$index]->net->width != 1) {
print '[',$ports[$index]->net->msb;
print ':',$ports[$index]->net->lsb,']';
}
print "\n";
}

print ' 'x4,");\n";
print "\n";
}
}

sub PrintIOInfo {
my ($netlist) = @_;

foreach my $module ($netlist->modules_sorted) {
my @ports = $module->ports_ordered;
if ($#ports == -1) { next; }

print "\/\/ ",$module->name,"\n";

my $max = 0;
for (my $index=0; $index <= $#ports; $index++) {
print $ports[$index]->name;
if (defined($ports[$index]->net->width) && $ports[$index]->net->width != 1) {
print '[',$ports[$index]->net->msb;
print ':',$ports[$index]->net->lsb,']';
}
print "\t";
print $ports[$index]->direction;
print "\n";
}
}
}

テーマ : プログラミング
ジャンル : コンピュータ

2010-03-25 : Work-Linux-Perl : コメント : 0 : トラックバック : 0
Pagetop
コメントの投稿
非公開コメント

Pagetop
« next  ホーム  prev »

プロフィール

zive

Author:zive
大阪在住、男

ブログ検索

月別アーカイブ

FC2カウンター