vertigo_vhdl 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/vertigo +7 -0
- data/lib/vertigo.rb +4 -0
- data/lib/vertigo/ast.rb +87 -0
- data/lib/vertigo/ast_vertigo_rkgen.rb +607 -0
- data/lib/vertigo/code.rb +57 -0
- data/lib/vertigo/compiler.rb +61 -0
- data/lib/vertigo/generic_lexer.rb +61 -0
- data/lib/vertigo/generic_parser.rb +44 -0
- data/lib/vertigo/indent.rb +20 -0
- data/lib/vertigo/lexer.rb +172 -0
- data/lib/vertigo/parser.rb +1458 -0
- data/lib/vertigo/pretty_printer.rb +749 -0
- data/lib/vertigo/runner.rb +115 -0
- data/lib/vertigo/tb_generator.rb +81 -0
- data/lib/vertigo/template.tb.vhd +72 -0
- data/lib/vertigo/token.rb +67 -0
- data/lib/vertigo/version.rb +3 -0
- data/lib/vertigo/vertigo.rkg +354 -0
- data/lib/vertigo/visitor_vertigo_rkgen.rb +447 -0
- data/tests/ghdl_tests/fsm.vhd +98 -0
- data/tests/ghdl_tests/fsm_synth.vhd +248 -0
- data/tests/ghdl_tests/test_fsm.vhd +162 -0
- data/tests/parser_tests/else.vhd +64 -0
- data/tests/parser_tests/test_MUST_fail.vhd +1 -0
- data/tests/parser_tests/test_accelerator.vhd +160 -0
- data/tests/parser_tests/test_accelerator_pp.vhd +144 -0
- data/tests/parser_tests/test_aggregate.vhd +17 -0
- data/tests/parser_tests/test_aggregate_pp.vhd +15 -0
- data/tests/parser_tests/test_archi_1.vhd +45 -0
- data/tests/parser_tests/test_archi_1_pp.vhd +41 -0
- data/tests/parser_tests/test_array_array_00.vhd +25 -0
- data/tests/parser_tests/test_array_array_00_pp.vhd +25 -0
- data/tests/parser_tests/test_array_urange.vhd +25 -0
- data/tests/parser_tests/test_array_urange_pp.vhd +25 -0
- data/tests/parser_tests/test_chu-1.vhd +80 -0
- data/tests/parser_tests/test_chu-1_pp.vhd +104 -0
- data/tests/parser_tests/test_concat.vhd +11 -0
- data/tests/parser_tests/test_concat_pp.vhd +14 -0
- data/tests/parser_tests/test_counter.vhd +35 -0
- data/tests/parser_tests/test_counter_pp.vhd +35 -0
- data/tests/parser_tests/test_de2.vhd +358 -0
- data/tests/parser_tests/test_de2_pp.vhd +274 -0
- data/tests/parser_tests/test_encode.vhd +2679 -0
- data/tests/parser_tests/test_encode_pp.vhd +2549 -0
- data/tests/parser_tests/test_fsm.vhd +162 -0
- data/tests/parser_tests/test_fsm_pp.vhd +125 -0
- data/tests/parser_tests/test_fsm_synth.vhd +248 -0
- data/tests/parser_tests/test_fsm_synth_pp.vhd +197 -0
- data/tests/parser_tests/test_function-01.vhd +33 -0
- data/tests/parser_tests/test_function-01_pp.vhd +18 -0
- data/tests/parser_tests/test_lfsr.vhd +75 -0
- data/tests/parser_tests/test_lfsr_pp.vhd +44 -0
- data/tests/parser_tests/test_microwatt_cache_ram.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cache_ram_pp.vhd +68 -0
- data/tests/parser_tests/test_microwatt_common.vhd +1 -0
- data/tests/parser_tests/test_microwatt_common_pp.vhd +336 -0
- data/tests/parser_tests/test_microwatt_control.vhd +1 -0
- data/tests/parser_tests/test_microwatt_control_pp.vhd +187 -0
- data/tests/parser_tests/test_microwatt_core.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_debug.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_debug_pp.vhd +104 -0
- data/tests/parser_tests/test_microwatt_core_pp.vhd +231 -0
- data/tests/parser_tests/test_microwatt_core_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_tb_pp.vhd +43 -0
- data/tests/parser_tests/test_microwatt_countzero.vhd +1 -0
- data/tests/parser_tests/test_microwatt_countzero_pp.vhd +120 -0
- data/tests/parser_tests/test_microwatt_countzero_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_countzero_tb_pp.vhd +70 -0
- data/tests/parser_tests/test_microwatt_cr_file.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cr_file_pp.vhd +74 -0
- data/tests/parser_tests/test_microwatt_cr_hazard.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cr_hazard_pp.vhd +51 -0
- data/tests/parser_tests/test_microwatt_crhelpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_crhelpers_pp.vhd +48 -0
- data/tests/parser_tests/test_microwatt_dcache.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dcache_pp.vhd +481 -0
- data/tests/parser_tests/test_microwatt_dcache_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dcache_tb_pp.vhd +98 -0
- data/tests/parser_tests/test_microwatt_decode1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode1_pp.vhd +138 -0
- data/tests/parser_tests/test_microwatt_decode2.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode2_pp.vhd +300 -0
- data/tests/parser_tests/test_microwatt_decode_types.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode_types_pp.vhd +67 -0
- data/tests/parser_tests/test_microwatt_divider.vhd +1 -0
- data/tests/parser_tests/test_microwatt_divider_pp.vhd +132 -0
- data/tests/parser_tests/test_microwatt_divider_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_divider_tb_pp.vhd +95 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_dummy.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_dummy_pp.vhd +29 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_tb_pp.vhd +197 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx_pp.vhd +139 -0
- data/tests/parser_tests/test_microwatt_execute1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_execute1_pp.vhd +689 -0
- data/tests/parser_tests/test_microwatt_fetch1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_fetch1_pp.vhd +88 -0
- data/tests/parser_tests/test_microwatt_fetch2.vhd +1 -0
- data/tests/parser_tests/test_microwatt_fetch2_pp.vhd +79 -0
- data/tests/parser_tests/test_microwatt_glibc_random.vhd +1 -0
- data/tests/parser_tests/test_microwatt_glibc_random_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_glibc_random_helpers_pp.vhd +25 -0
- data/tests/parser_tests/test_microwatt_glibc_random_pp.vhd +41 -0
- data/tests/parser_tests/test_microwatt_gpr_hazard.vhd +1 -0
- data/tests/parser_tests/test_microwatt_gpr_hazard_pp.vhd +68 -0
- data/tests/parser_tests/test_microwatt_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_helpers_pp.vhd +153 -0
- data/tests/parser_tests/test_microwatt_icache.vhd +1 -0
- data/tests/parser_tests/test_microwatt_icache_pp.vhd +337 -0
- data/tests/parser_tests/test_microwatt_icache_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_icache_tb_pp.vhd +104 -0
- data/tests/parser_tests/test_microwatt_insn_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_insn_helpers_pp.vhd +208 -0
- data/tests/parser_tests/test_microwatt_loadstore1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_loadstore1_pp.vhd +222 -0
- data/tests/parser_tests/test_microwatt_logical.vhd +1 -0
- data/tests/parser_tests/test_microwatt_logical_pp.vhd +87 -0
- data/tests/parser_tests/test_microwatt_multiply.vhd +1 -0
- data/tests/parser_tests/test_microwatt_multiply_pp.vhd +84 -0
- data/tests/parser_tests/test_microwatt_multiply_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_multiply_tb_pp.vhd +75 -0
- data/tests/parser_tests/test_microwatt_plru.vhd +1 -0
- data/tests/parser_tests/test_microwatt_plru_pp.vhd +46 -0
- data/tests/parser_tests/test_microwatt_plru_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_plru_tb_pp.vhd +93 -0
- data/tests/parser_tests/test_microwatt_ppc_fx_insns.vhd +1 -0
- data/tests/parser_tests/test_microwatt_ppc_fx_insns_pp.vhd +665 -0
- data/tests/parser_tests/test_microwatt_register_file.vhd +1 -0
- data/tests/parser_tests/test_microwatt_register_file_pp.vhd +86 -0
- data/tests/parser_tests/test_microwatt_rotator.vhd +1 -0
- data/tests/parser_tests/test_microwatt_rotator_pp.vhd +149 -0
- data/tests/parser_tests/test_microwatt_rotator_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_rotator_tb_pp.vhd +134 -0
- data/tests/parser_tests/test_microwatt_sim_bram.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_bram_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_bram_helpers_pp.vhd +52 -0
- data/tests/parser_tests/test_microwatt_sim_bram_pp.vhd +53 -0
- data/tests/parser_tests/test_microwatt_sim_console.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_console_pp.vhd +43 -0
- data/tests/parser_tests/test_microwatt_sim_jtag.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_pp.vhd +64 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_socket.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_socket_pp.vhd +36 -0
- data/tests/parser_tests/test_microwatt_sim_uart.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_uart_pp.vhd +90 -0
- data/tests/parser_tests/test_microwatt_soc.vhd +1 -0
- data/tests/parser_tests/test_microwatt_soc_pp.vhd +195 -0
- data/tests/parser_tests/test_microwatt_utils.vhd +1 -0
- data/tests/parser_tests/test_microwatt_utils_pp.vhd +39 -0
- data/tests/parser_tests/test_microwatt_wishbone_arbiter.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_arbiter_pp.vhd +54 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_tb_pp.vhd +157 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper_pp.vhd +62 -0
- data/tests/parser_tests/test_microwatt_wishbone_debug_master.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_debug_master_pp.vhd +124 -0
- data/tests/parser_tests/test_microwatt_wishbone_types.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_types_pp.vhd +38 -0
- data/tests/parser_tests/test_microwatt_writeback.vhd +1 -0
- data/tests/parser_tests/test_microwatt_writeback_pp.vhd +87 -0
- data/tests/parser_tests/test_package-1.vhd +68 -0
- data/tests/parser_tests/test_package-1_pp.vhd +53 -0
- data/tests/parser_tests/test_precedence.vhd +13 -0
- data/tests/parser_tests/test_precedence_pp.vhd +16 -0
- data/tests/parser_tests/test_selected_sig.vhd +14 -0
- data/tests/parser_tests/test_selected_sig_pp.vhd +10 -0
- data/tests/parser_tests/test_slice.vhd +15 -0
- data/tests/parser_tests/test_slice_pp.vhd +16 -0
- data/tests/parser_tests/test_tb-00.vhd +94 -0
- data/tests/parser_tests/test_tb-00_pp.vhd +71 -0
- data/tests/parser_tests/test_type_decl_02.vhd +9 -0
- data/tests/parser_tests/test_type_decl_02_pp.vhd +11 -0
- data/tests/parser_tests/test_use.vhd +7 -0
- data/tests/parser_tests/test_use_pp.vhd +10 -0
- data/tests/parser_tests/test_while_1.vhd +38 -0
- data/tests/parser_tests/test_while_1_pp.vhd +26 -0
- data/tests/parser_tests/test_with-00.vhd +21 -0
- data/tests/parser_tests/test_with-00_pp.vhd +12 -0
- data/tests/tb_gen_tests/test_accelerator.vhd +160 -0
- metadata +224 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
require_relative "compiler"
|
4
|
+
|
5
|
+
module Vertigo
|
6
|
+
|
7
|
+
class Runner
|
8
|
+
|
9
|
+
def self.run *arguments
|
10
|
+
new.run(arguments)
|
11
|
+
end
|
12
|
+
|
13
|
+
def run arguments
|
14
|
+
compiler=Compiler.new
|
15
|
+
compiler.options = args = parse_options(arguments)
|
16
|
+
begin
|
17
|
+
if args[:parse_only]
|
18
|
+
filename=args[:vhdl_file]
|
19
|
+
ok=compiler.parse(filename)
|
20
|
+
elsif args[:gen_tb]
|
21
|
+
filename=args[:vhdl_file]
|
22
|
+
ok=compiler.gen_tb(filename)
|
23
|
+
elsif filename=args[:vhdl_file]
|
24
|
+
ok=compiler.compile(filename)
|
25
|
+
else
|
26
|
+
raise "need a VHDL file : vhdl_tb [options] <file.vhd>"
|
27
|
+
end
|
28
|
+
return ok
|
29
|
+
rescue Exception => e
|
30
|
+
puts e unless compiler.options[:mute]
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def header
|
36
|
+
puts "Vertigo -- VHDL utilities (#{VERSION})- (c) JC Le Lann 2016-20"
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def parse_options(arguments)
|
41
|
+
|
42
|
+
parser = OptionParser.new
|
43
|
+
|
44
|
+
no_arguments=arguments.empty?
|
45
|
+
|
46
|
+
options = {}
|
47
|
+
|
48
|
+
parser.on("-h", "--help", "Show help message") do
|
49
|
+
puts parser
|
50
|
+
exit(true)
|
51
|
+
end
|
52
|
+
|
53
|
+
parser.on("-p", "--parse", "parse only") do
|
54
|
+
options[:parse_only]=true
|
55
|
+
end
|
56
|
+
|
57
|
+
parser.on("--dump", "dump ast") do
|
58
|
+
options[:dump_ast]=true
|
59
|
+
end
|
60
|
+
|
61
|
+
parser.on("--pp", "pretty print back source code, in the console") do
|
62
|
+
options[:pp] = true
|
63
|
+
end
|
64
|
+
|
65
|
+
parser.on("--pp_to_file", "pretty print back source code, to a _pp.vhd file") do
|
66
|
+
options[:pp_to_file] = true
|
67
|
+
end
|
68
|
+
|
69
|
+
parser.on("--ast", "abstract syntax tree (AST)") do
|
70
|
+
options[:ast] = true
|
71
|
+
end
|
72
|
+
|
73
|
+
parser.on("--check", "elaborate and check types") do
|
74
|
+
options[:check] = true
|
75
|
+
end
|
76
|
+
|
77
|
+
parser.on("--draw_ast", "draw abstract syntax tree (AST)") do
|
78
|
+
options[:draw_ast] = true
|
79
|
+
end
|
80
|
+
|
81
|
+
parser.on("--gen_tb", "generates a testbench for the first entity/arch pair found") do
|
82
|
+
options[:gen_tb] = true
|
83
|
+
end
|
84
|
+
|
85
|
+
parser.on("--dummy_transform", "dummy ast transform") do
|
86
|
+
options[:dummy_transform] = true
|
87
|
+
end
|
88
|
+
|
89
|
+
parser.on("--vv", "verbose") do
|
90
|
+
options[:verbose] = true
|
91
|
+
end
|
92
|
+
|
93
|
+
parser.on("--mute","mute") do
|
94
|
+
options[:mute]=true
|
95
|
+
end
|
96
|
+
|
97
|
+
parser.on("-v", "--version", "Show version number") do
|
98
|
+
puts VERSION
|
99
|
+
exit(true)
|
100
|
+
end
|
101
|
+
|
102
|
+
parser.parse!(arguments)
|
103
|
+
|
104
|
+
header unless options[:mute]
|
105
|
+
|
106
|
+
options[:vhdl_file]=arguments.shift #the remaining c file
|
107
|
+
|
108
|
+
if no_arguments
|
109
|
+
puts parser
|
110
|
+
end
|
111
|
+
|
112
|
+
options
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Vertigo
|
4
|
+
|
5
|
+
class TestBenchGenerator
|
6
|
+
attr_accessor :ast
|
7
|
+
attr_accessor :entity,:arch
|
8
|
+
attr_accessor :clk,:rst
|
9
|
+
def initialize options={}
|
10
|
+
@options=options
|
11
|
+
@supplemental_libs_h=options[:supplemental_libs_h]||{}
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_from ast
|
15
|
+
@ast=ast
|
16
|
+
entity_arch=find_entity_arch
|
17
|
+
detecting_clk_and_reset entity_arch
|
18
|
+
@tb_name=entity_arch.first.name.str+'_tb'
|
19
|
+
erb=ERB.new(IO.read "#{__dir__}/template.tb.vhd")
|
20
|
+
vhdl_tb=erb.result(binding)
|
21
|
+
tb_filename=@tb_name+".vhd"
|
22
|
+
File.open(tb_filename,'w'){|f| f.puts vhdl_tb}
|
23
|
+
puts "=> generated testbench : #{tb_filename}"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def find_entity_arch
|
28
|
+
@entity=ast.design_units.find{|du| du.is_a? Entity}
|
29
|
+
if @entity.nil?
|
30
|
+
puts msg="ERROR : no entity found"
|
31
|
+
raise msg
|
32
|
+
end
|
33
|
+
puts "=> found entity '#{entity.name.str}'"
|
34
|
+
@arch=ast.design_units.find{|du| du.is_a? Architecture}
|
35
|
+
if @arch.nil?
|
36
|
+
puts msg="ERROR : no architecture found"
|
37
|
+
raise msg
|
38
|
+
end
|
39
|
+
|
40
|
+
puts "=> found architecture '#{arch.name.str}'"
|
41
|
+
[@entity,@arch]
|
42
|
+
end
|
43
|
+
|
44
|
+
def detecting_clk_and_reset entity_arch
|
45
|
+
puts "=> detecting clock and reset"
|
46
|
+
entity,arch=entity_arch
|
47
|
+
inputs=entity.ports.select{|port| port.is_a?(Input)}
|
48
|
+
@clk = inputs.sort_by{|input| levenshtein_distance(input.name.str,"clk")}.first
|
49
|
+
@rst = inputs.sort_by{|input| levenshtein_distance(input.name.str,"reset")}.first
|
50
|
+
puts "\t-most probable clk : #{@clk.name.str}"
|
51
|
+
puts "\t-most probable reset : #{@rst.name.str}"
|
52
|
+
@max_length_str=entity.ports.map{|port| port.name.str.size}.max
|
53
|
+
@excluded=[@clk,@rst]
|
54
|
+
end
|
55
|
+
|
56
|
+
def levenshtein_distance(s, t)
|
57
|
+
m = s.length
|
58
|
+
n = t.length
|
59
|
+
return m if n == 0
|
60
|
+
return n if m == 0
|
61
|
+
d = Array.new(m+1) {Array.new(n+1)}
|
62
|
+
|
63
|
+
(0..m).each {|i| d[i][0] = i}
|
64
|
+
(0..n).each {|j| d[0][j] = j}
|
65
|
+
(1..n).each do |j|
|
66
|
+
(1..m).each do |i|
|
67
|
+
d[i][j] = if s[i-1] == t[j-1] # adjust index into string
|
68
|
+
d[i-1][j-1] # no operation required
|
69
|
+
else
|
70
|
+
[ d[i-1][j]+1, # deletion
|
71
|
+
d[i][j-1]+1, # insertion
|
72
|
+
d[i-1][j-1]+1, # substitution
|
73
|
+
].min
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
d[m][n]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
-----------------------------------------------------------------
|
2
|
+
-- This file was generated automatically by Vertigo Ruby utility
|
3
|
+
-- date : <%=Time.now.strftime("(d/m/y) %d/%m/%Y %H:%M")%>
|
4
|
+
-- Author : Jean-Christophe Le Lann - 2014
|
5
|
+
-----------------------------------------------------------------
|
6
|
+
library ieee;
|
7
|
+
use ieee.std_logic_1164.all;
|
8
|
+
use ieee.numeric_std.all;
|
9
|
+
<%@supplemental_libs_h.each do |lib,packages|%>
|
10
|
+
library <%=lib%>;
|
11
|
+
<%packages.each do |package|%>
|
12
|
+
use <%=lib%>.<%=package%>.all;
|
13
|
+
<%end%>
|
14
|
+
<%end%>
|
15
|
+
|
16
|
+
entity <%=@tb_name%> is
|
17
|
+
end entity;
|
18
|
+
|
19
|
+
architecture bhv of <%=@tb_name%> is
|
20
|
+
|
21
|
+
constant HALF_PERIOD : time := 5 ns;
|
22
|
+
|
23
|
+
signal <%=clk.name.str%> : std_logic := '0';
|
24
|
+
signal <%=rst.name.str%> : std_logic := '0';
|
25
|
+
|
26
|
+
signal running : boolean := true;
|
27
|
+
|
28
|
+
procedure wait_cycles(n : natural) is
|
29
|
+
begin
|
30
|
+
for i in 1 to n loop
|
31
|
+
wait until rising_edge(clk);
|
32
|
+
end loop;
|
33
|
+
end procedure;
|
34
|
+
|
35
|
+
<%=@entity.ports.collect do |port|
|
36
|
+
" signal #{port.name.str.ljust(@max_length_str)} : #{port.type.str}" if not @excluded.include?(port)
|
37
|
+
end.compact.join(";\n")%>;
|
38
|
+
|
39
|
+
begin
|
40
|
+
-------------------------------------------------------------------
|
41
|
+
-- clock and reset
|
42
|
+
-------------------------------------------------------------------
|
43
|
+
reset_n <= '0','1' after 666 ns;
|
44
|
+
|
45
|
+
clk <= not(clk) after HALF_PERIOD when running else clk;
|
46
|
+
|
47
|
+
--------------------------------------------------------------------
|
48
|
+
-- Design Under Test
|
49
|
+
--------------------------------------------------------------------
|
50
|
+
dut : entity work.<%=@entity.name.str%>(<%=@arch.name.str%>)
|
51
|
+
<%=@generics%>
|
52
|
+
port map ( <%map=@entity.ports.collect do |port| "\t #{port.name.str} => #{port.name.str}" end%>
|
53
|
+
<%=map.join(",\n")%>
|
54
|
+
);
|
55
|
+
|
56
|
+
--------------------------------------------------------------------
|
57
|
+
-- sequential stimuli
|
58
|
+
--------------------------------------------------------------------
|
59
|
+
stim : process
|
60
|
+
begin
|
61
|
+
report "running testbench for <%=@entity.name.str%>(<%=@arch.name.str%>)";
|
62
|
+
report "waiting for asynchronous reset";
|
63
|
+
wait until reset_n='1';
|
64
|
+
wait_cycles(100);
|
65
|
+
report "applying stimuli...";
|
66
|
+
wait_cycles(100);
|
67
|
+
report "end of simulation";
|
68
|
+
running <=false;
|
69
|
+
wait;
|
70
|
+
end process;
|
71
|
+
|
72
|
+
end bhv;
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Vertigo
|
2
|
+
|
3
|
+
class Token
|
4
|
+
attr_accessor :kind,:val,:pos
|
5
|
+
def initialize tab
|
6
|
+
@kind,@val,@pos=*tab
|
7
|
+
end
|
8
|
+
|
9
|
+
def is_a? kind
|
10
|
+
case kind
|
11
|
+
when Symbol
|
12
|
+
return @kind==kind
|
13
|
+
when Array
|
14
|
+
for sym in kind
|
15
|
+
return true if @kind==sym
|
16
|
+
end
|
17
|
+
return false
|
18
|
+
else
|
19
|
+
raise "wrong type during lookahead"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def not_a? kind
|
24
|
+
result=self.is_a? kind
|
25
|
+
!result
|
26
|
+
end
|
27
|
+
|
28
|
+
def is_not_a? kind
|
29
|
+
case kind
|
30
|
+
when Symbol
|
31
|
+
return @kind!=kind
|
32
|
+
when Array
|
33
|
+
ret=true
|
34
|
+
for sym in kind
|
35
|
+
ret=false if @kind==sym
|
36
|
+
end
|
37
|
+
return ret
|
38
|
+
else
|
39
|
+
raise "wrong type during lookahead"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def accept visitor,args=nil
|
44
|
+
visitor.visitToken(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.create kind,str
|
48
|
+
Token.new [kind,str,[0,0]]
|
49
|
+
end
|
50
|
+
|
51
|
+
# def inspect
|
52
|
+
# "(#{@kind.to_s.ljust(15,' ')},'#{@val}',#{@pos})"
|
53
|
+
# end
|
54
|
+
|
55
|
+
def str
|
56
|
+
val
|
57
|
+
end
|
58
|
+
|
59
|
+
def clone
|
60
|
+
Token.new([@kind,@val,@pos])
|
61
|
+
end
|
62
|
+
|
63
|
+
def line
|
64
|
+
pos.first
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,354 @@
|
|
1
|
+
|
2
|
+
- Root:
|
3
|
+
- design_unitS
|
4
|
+
|
5
|
+
- Comment:
|
6
|
+
- str
|
7
|
+
|
8
|
+
- Library:
|
9
|
+
- name
|
10
|
+
|
11
|
+
- Use:
|
12
|
+
- library
|
13
|
+
- package
|
14
|
+
- element
|
15
|
+
|
16
|
+
- Entity:
|
17
|
+
- name
|
18
|
+
- genericS
|
19
|
+
- portS
|
20
|
+
|
21
|
+
- Generic:
|
22
|
+
- name
|
23
|
+
- type
|
24
|
+
- init
|
25
|
+
|
26
|
+
- Input:
|
27
|
+
- name
|
28
|
+
- type
|
29
|
+
- init
|
30
|
+
|
31
|
+
- Output:
|
32
|
+
- name
|
33
|
+
- type
|
34
|
+
- init
|
35
|
+
|
36
|
+
- InOut:
|
37
|
+
- name
|
38
|
+
- type
|
39
|
+
- init
|
40
|
+
#===================
|
41
|
+
- Package:
|
42
|
+
- name
|
43
|
+
- declS
|
44
|
+
|
45
|
+
- PackageBody:
|
46
|
+
- name
|
47
|
+
- declS
|
48
|
+
|
49
|
+
- ProcedureDecl:
|
50
|
+
- name
|
51
|
+
- formal_argS
|
52
|
+
- declS
|
53
|
+
- body
|
54
|
+
|
55
|
+
- FormalArg:
|
56
|
+
- signal
|
57
|
+
- direction
|
58
|
+
- name
|
59
|
+
- type
|
60
|
+
|
61
|
+
- ProcedureCall:
|
62
|
+
- name
|
63
|
+
- actual_argS
|
64
|
+
#====================
|
65
|
+
- Architecture:
|
66
|
+
- name
|
67
|
+
- entity_name
|
68
|
+
- declS
|
69
|
+
- body
|
70
|
+
|
71
|
+
- Body:
|
72
|
+
- elementS
|
73
|
+
|
74
|
+
- Process:
|
75
|
+
- sensitivity
|
76
|
+
- declS
|
77
|
+
- body
|
78
|
+
|
79
|
+
- Sensitivity:
|
80
|
+
- elementS
|
81
|
+
|
82
|
+
- EntityInstance:
|
83
|
+
- full_name
|
84
|
+
- arch_name
|
85
|
+
- generic_map
|
86
|
+
- port_map
|
87
|
+
|
88
|
+
- ComponentDecl:
|
89
|
+
- name
|
90
|
+
- genericS
|
91
|
+
- portS
|
92
|
+
|
93
|
+
- ComponentInstance:
|
94
|
+
- name
|
95
|
+
- generic_map
|
96
|
+
- port_map
|
97
|
+
|
98
|
+
- PortMap:
|
99
|
+
- elementS
|
100
|
+
|
101
|
+
- GenericMap:
|
102
|
+
- elementS
|
103
|
+
|
104
|
+
- Map:
|
105
|
+
- lhs
|
106
|
+
- rhs
|
107
|
+
|
108
|
+
- AttributeDecl:
|
109
|
+
- name
|
110
|
+
- type
|
111
|
+
|
112
|
+
- AttributeSpec:
|
113
|
+
- name
|
114
|
+
- entity_spec
|
115
|
+
- expr
|
116
|
+
|
117
|
+
- EntitySpec:
|
118
|
+
- elementS
|
119
|
+
- entity_class
|
120
|
+
|
121
|
+
#======= statements =====
|
122
|
+
|
123
|
+
- SigAssign:
|
124
|
+
- lhs
|
125
|
+
- rhs
|
126
|
+
|
127
|
+
- varAssign:
|
128
|
+
- lhs
|
129
|
+
- rhs
|
130
|
+
|
131
|
+
- wait:
|
132
|
+
- until_
|
133
|
+
- for_
|
134
|
+
|
135
|
+
- If:
|
136
|
+
- cond
|
137
|
+
- body
|
138
|
+
- elsifS
|
139
|
+
- else_
|
140
|
+
|
141
|
+
- Elsif:
|
142
|
+
- cond
|
143
|
+
- body
|
144
|
+
|
145
|
+
- Else:
|
146
|
+
- body
|
147
|
+
|
148
|
+
- Case:
|
149
|
+
- expr
|
150
|
+
- whenS
|
151
|
+
|
152
|
+
- CaseWhen:
|
153
|
+
- expr
|
154
|
+
- body
|
155
|
+
|
156
|
+
- Alternative:
|
157
|
+
- elementS
|
158
|
+
|
159
|
+
- NullStmt:
|
160
|
+
- dummy
|
161
|
+
|
162
|
+
- Assert:
|
163
|
+
- cond
|
164
|
+
- report
|
165
|
+
- severity
|
166
|
+
|
167
|
+
- Report:
|
168
|
+
- expr
|
169
|
+
- severity
|
170
|
+
|
171
|
+
- Severity:
|
172
|
+
- type
|
173
|
+
|
174
|
+
- Return:
|
175
|
+
- expr
|
176
|
+
|
177
|
+
- WithSelect:
|
178
|
+
- with_expr
|
179
|
+
- assigned
|
180
|
+
- selected_whenS
|
181
|
+
|
182
|
+
- SelectedWhen:
|
183
|
+
- lhs
|
184
|
+
- rhs
|
185
|
+
|
186
|
+
- IfGenerate:
|
187
|
+
- cond
|
188
|
+
- body
|
189
|
+
|
190
|
+
- ForGenerate:
|
191
|
+
- index
|
192
|
+
- range
|
193
|
+
- declS
|
194
|
+
- body
|
195
|
+
|
196
|
+
- IsolatedRange:
|
197
|
+
- lhs
|
198
|
+
- rhs
|
199
|
+
|
200
|
+
#====================
|
201
|
+
- TypeDecl:
|
202
|
+
- name
|
203
|
+
- spec
|
204
|
+
|
205
|
+
- SubTypeDecl:
|
206
|
+
- name
|
207
|
+
- spec
|
208
|
+
|
209
|
+
- EnumDecl:
|
210
|
+
- elementS
|
211
|
+
|
212
|
+
- RecordDecl:
|
213
|
+
- elementS
|
214
|
+
|
215
|
+
- RecordItem:
|
216
|
+
- name
|
217
|
+
- type
|
218
|
+
|
219
|
+
- ArrayDecl:
|
220
|
+
- dim_declS
|
221
|
+
- type
|
222
|
+
|
223
|
+
- ArrayDimDecl:
|
224
|
+
- type_mark
|
225
|
+
- range
|
226
|
+
|
227
|
+
- Constant:
|
228
|
+
- name
|
229
|
+
- type
|
230
|
+
- expr
|
231
|
+
|
232
|
+
- Signal:
|
233
|
+
- name
|
234
|
+
- type
|
235
|
+
- init
|
236
|
+
|
237
|
+
- Variable:
|
238
|
+
- name
|
239
|
+
- type
|
240
|
+
- init
|
241
|
+
|
242
|
+
- Alias:
|
243
|
+
- designator
|
244
|
+
- type
|
245
|
+
- name
|
246
|
+
- signature
|
247
|
+
|
248
|
+
- StdType:
|
249
|
+
- ident
|
250
|
+
|
251
|
+
- RangedType:
|
252
|
+
- type
|
253
|
+
- range
|
254
|
+
|
255
|
+
- NamedType:
|
256
|
+
- ident
|
257
|
+
|
258
|
+
- ArrayType:
|
259
|
+
- name
|
260
|
+
- discrete_rangeS
|
261
|
+
|
262
|
+
- DiscreteRange:
|
263
|
+
- lhs
|
264
|
+
- dir
|
265
|
+
- rhs
|
266
|
+
|
267
|
+
# === expressions
|
268
|
+
- Parenth:
|
269
|
+
- expr
|
270
|
+
|
271
|
+
- Waveform:
|
272
|
+
- elementS
|
273
|
+
|
274
|
+
- CondExpr:
|
275
|
+
- whenS
|
276
|
+
- else_
|
277
|
+
|
278
|
+
- When:
|
279
|
+
- expr
|
280
|
+
- cond
|
281
|
+
|
282
|
+
- Binary:
|
283
|
+
- lhs
|
284
|
+
- op
|
285
|
+
- rhs
|
286
|
+
|
287
|
+
- After:
|
288
|
+
- lhs
|
289
|
+
- rhs
|
290
|
+
|
291
|
+
- Timed:
|
292
|
+
- lhs
|
293
|
+
- rhs
|
294
|
+
|
295
|
+
- Attributed:
|
296
|
+
- lhs
|
297
|
+
- rhs
|
298
|
+
|
299
|
+
- Concat:
|
300
|
+
- lhs
|
301
|
+
- rhs
|
302
|
+
|
303
|
+
- Qualified:
|
304
|
+
- lhs
|
305
|
+
- rhs
|
306
|
+
|
307
|
+
- Sliced:
|
308
|
+
- expr
|
309
|
+
- lhs
|
310
|
+
- dir
|
311
|
+
- rhs
|
312
|
+
|
313
|
+
# === terms
|
314
|
+
- ident:
|
315
|
+
- tok
|
316
|
+
|
317
|
+
- IntLit:
|
318
|
+
- tok
|
319
|
+
|
320
|
+
- CharLit:
|
321
|
+
- tok
|
322
|
+
|
323
|
+
- BoolLit:
|
324
|
+
- tok
|
325
|
+
|
326
|
+
- selectedName:
|
327
|
+
- lhs
|
328
|
+
- rhs
|
329
|
+
|
330
|
+
- FuncProtoDecl:
|
331
|
+
- name
|
332
|
+
- formal_argS
|
333
|
+
- return_type
|
334
|
+
|
335
|
+
- FuncDecl:
|
336
|
+
- name
|
337
|
+
- formal_argS
|
338
|
+
- return_type
|
339
|
+
- decls
|
340
|
+
- body
|
341
|
+
|
342
|
+
- FuncCall:
|
343
|
+
- name
|
344
|
+
- actual_argS
|
345
|
+
|
346
|
+
- Aggregate:
|
347
|
+
- elementS
|
348
|
+
|
349
|
+
- Label:
|
350
|
+
- ident
|
351
|
+
|
352
|
+
- Assoc:
|
353
|
+
- lhs
|
354
|
+
- rhs
|