« Makefile | Main | Gauche-gtk »

2007.05.26

Verilog-Perl

ちょっと評価するタイミングが遅れたけど、Verilog-Perl使ってみました。Monpe's Roomさんを参考に試してみました。

#!/usr/bin/perl -w

use strict;
use Verilog::Netlist;


my @FileList = ('ide_if.v', 'ide_reg.h', 'ide_reset.v',
'ide_sector_read.v', 'ide_sector_set.v',
'shallot.v', 'shallot_sm.v');


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

exit(0);

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

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

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

sub PrintHier{
my ($nl) = @_;
# Read in any sub-modules
$nl->link();
$nl->lint();
$nl->exit_if_error();

foreach my $mod ($nl->top_modules_sorted) {
show_hier ($mod, " ", "", "");
}
}

sub show_hier {
my $mod = shift;
my $indent = shift;
my $hier = shift;
my $cellname = shift;
if (!$cellname) {$hier = $mod->name;} #top modules get the design name
else {$hier .= ".$cellname";} #append the cellname
printf ("%-45s %s\n", $indent."Module ".$mod->name,$hier);
foreach my $sig ($mod->ports_sorted) {
#printf ($indent." %sput %s\n", $sig->direction, $sig->name);
}
foreach my $cell ($mod->cells_sorted) {
#printf ($indent. " Cell %s\n", $cell->name);
foreach my $pin ($cell->pins_sorted) {
# printf ($indent." .%s(%s)\n", $pin->name, $pin->netname);
}
show_hier ($cell->submod, $indent." ", $hier, $cell->name) if $cell->submod;
}
}

自作のIDEコントローラを読ませると、
 Module shallot shallot
  Module ide_if shallot.ide_if
  Module ide_reset shallot.ide_reset
  Module ide_sector_read shallot.ide_sector_read
  Module ide_sector_set shallot.ide_sector_set
  Module shallot_sm shallot.shallot_sm
こんな感じで階層を出してくれます。もちろんソースのコメントアウトをはずすと、ポートとかインスタンス名(っぽい?)も出してくれます。


調子に乗って、たっくさんのmipsも試してみる。

my $opt = new Verilog::Getopt;
$opt->parameter( "-DALTERA");
でALTERAをdefineさせて実行すると、

%Error: uart_write_cyclone.v:29: Cannot find fifo512_cyclone
%Error: uart_write_cyclone.v:29: Cannot find fifo512_cyclone
%Error: uart_write_cyclone.v:29: Module reference not found: fifo512_cyclone
Exiting due to errors

残念ながら階層構造を作るところでエラー。しかし、dummyのfifo512_cycloneを用意してあげると普通に通る。


Module gen_1port_ram gen_1port_ram
Module ram_module_altera ram_module_altera
Module tb_wb_conbus tb_wb_conbus
Module hardware_top tb_wb_conbus.dut
Module wb_conbus_top tb_wb_conbus.dut.conbus
Module wb_conbus_arb tb_wb_conbus.dut.conbus.wb_conbus_arb
Module wishbone_yacc tb_wb_conbus.dut.yacc_as_wb_master
Module cache_module tb_wb_conbus.dut.yacc_as_wb_master.d_cache_module
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.d_cache_module.ram0
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.d_cache_module.ram1
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.d_cache_module.ram2
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.d_cache_module.ram3
Module icache_module tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module.ram0_way0
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module.ram0_way1
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module.ram1_way0
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module.ram1_way1
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module.ram2_way0
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module.ram2_way1
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module.ram3_way0
Module single_port_ram tb_wb_conbus.dut.yacc_as_wb_master.i_cache_module.ram3_way1
Module cpu_core tb_wb_conbus.dut.yacc_as_wb_master.yacc
Module mul_div tb_wb_conbus.dut.yacc_as_wb_master.yacc.MulDiv
Module alu tb_wb_conbus.dut.yacc_as_wb_master.yacc.alu1
Module substruct tb_wb_conbus.dut.yacc_as_wb_master.yacc.alu1.sub
Module gen_ram32x32 tb_wb_conbus.dut.yacc_as_wb_master.yacc.ram_regfile32xx32
Module shifter tb_wb_conbus.dut.yacc_as_wb_master.yacc.sh1
Module onchip_ram_top tb_wb_conbus.onchip_ram
Module lpm_ram_dq_bank tb_wb_conbus.onchip_ram.lpm_ram_dq_component_bank0
Module lpm_ram_dq_bank tb_wb_conbus.onchip_ram.lpm_ram_dq_component_bank1
Module lpm_ram_dq_bank tb_wb_conbus.onchip_ram.lpm_ram_dq_component_bank2
Module lpm_ram_dq_bank tb_wb_conbus.onchip_ram.lpm_ram_dq_component_bank3
Module virtual_io_port tb_wb_conbus.virtual_io_port
Module top top
Module uart_read uart_read
Module uart_write uart_write
Module fifo512_cyclone uart_write.fifo
Module yacc_test yacc_test
Module cpu_core yacc_test.new_yacc
Module mul_div yacc_test.new_yacc.MulDiv
Module alu yacc_test.new_yacc.alu1
Module substruct yacc_test.new_yacc.alu1.sub
Module gen_ram32x32 yacc_test.new_yacc.ram_regfile32xx32
Module shifter yacc_test.new_yacc.sh1
Module ram yacc_test.ram_module

すげー!。
やっぱりPerl最強。

|

« Makefile | Main | Gauche-gtk »

Comments

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference Verilog-Perl:

« Makefile | Main | Gauche-gtk »