vertigo_vhdl 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 @@
|
|
|
1
|
+
../microwatt/utils.vhdl
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
-- generated by Vertigo VHDL tool
|
|
2
|
+
library ieee;
|
|
3
|
+
use ieee.std_logic_1164.all;
|
|
4
|
+
use ieee.numeric_std.all;
|
|
5
|
+
|
|
6
|
+
package utils is
|
|
7
|
+
function log2(i : natural) return integer
|
|
8
|
+
function log2ceil(i : natural) return integer
|
|
9
|
+
function ispow2(i : integer) return boolean
|
|
10
|
+
|
|
11
|
+
end utils;
|
|
12
|
+
|
|
13
|
+
package body utils is
|
|
14
|
+
|
|
15
|
+
function log2(i : natural) return integer is
|
|
16
|
+
variable tmp : integer := i;
|
|
17
|
+
variable ret : integer := 0;
|
|
18
|
+
begin
|
|
19
|
+
;
|
|
20
|
+
return ret;
|
|
21
|
+
end function log2;
|
|
22
|
+
|
|
23
|
+
function log2ceil(i : natural) return integer is
|
|
24
|
+
variable tmp : integer := i;
|
|
25
|
+
variable ret : integer := 0;
|
|
26
|
+
begin
|
|
27
|
+
;
|
|
28
|
+
return ret;
|
|
29
|
+
end function log2ceil;
|
|
30
|
+
|
|
31
|
+
function ispow2(i : integer) return boolean is
|
|
32
|
+
begin
|
|
33
|
+
if to_integer(to_unsigned(i,32) and to_unsigned(i - 1,32)) = 0 then
|
|
34
|
+
return true;
|
|
35
|
+
else
|
|
36
|
+
return false;
|
|
37
|
+
end if;
|
|
38
|
+
end function ispow2;
|
|
39
|
+
end utils;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../microwatt/wishbone_arbiter.vhdl
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
-- generated by Vertigo VHDL tool
|
|
2
|
+
library ieee;
|
|
3
|
+
use ieee.std_logic_1164.all;
|
|
4
|
+
library work;
|
|
5
|
+
use work.wishbone_types.all;
|
|
6
|
+
|
|
7
|
+
entity wishbone_arbiter is
|
|
8
|
+
generic(
|
|
9
|
+
num_masters : positive3 := 3);
|
|
10
|
+
port(
|
|
11
|
+
clk : in std_ulogic;
|
|
12
|
+
rst : in std_ulogic;
|
|
13
|
+
wb_masters_in : in wishbone_master_out_vector(0 to num_masters - 1);
|
|
14
|
+
wb_masters_out : out wishbone_slave_out_vector(0 to num_masters - 1);
|
|
15
|
+
wb_slave_out : out wishbone_master_out;
|
|
16
|
+
wb_slave_in : in wishbone_slave_out);
|
|
17
|
+
end entity wishbone_arbiter;
|
|
18
|
+
|
|
19
|
+
architecture behave of wishbone_arbiter is
|
|
20
|
+
|
|
21
|
+
subtype wb_arb_master_t is integer range 0 to num_masters - 1;
|
|
22
|
+
signal candidate : wb_arb_master_t;
|
|
23
|
+
signal selected : wb_arb_master_t;
|
|
24
|
+
signal busy : std_ulogic;
|
|
25
|
+
begin
|
|
26
|
+
|
|
27
|
+
busy <= wb_masters_in(selected).cyc;
|
|
28
|
+
|
|
29
|
+
wishbone_muxes : process(selected,candidate,busy,wb_slave_in,wb_masters_in)
|
|
30
|
+
variable early_sel : wb_arb_master_t;
|
|
31
|
+
begin
|
|
32
|
+
early_sel := selected;
|
|
33
|
+
if busy = '0' then
|
|
34
|
+
early_sel := candidate;
|
|
35
|
+
end if;
|
|
36
|
+
wb_slave_out <= wb_masters_in(early_sel);
|
|
37
|
+
end process;
|
|
38
|
+
|
|
39
|
+
wishbone_candidate : process(all)
|
|
40
|
+
begin
|
|
41
|
+
candidate <= selected;
|
|
42
|
+
end process;
|
|
43
|
+
|
|
44
|
+
wishbone_arbiter_process : process(clk)
|
|
45
|
+
begin
|
|
46
|
+
if rising_edge(clk) then
|
|
47
|
+
if rst = '1' then
|
|
48
|
+
selected <= 0;
|
|
49
|
+
elsif busy = '0' then
|
|
50
|
+
selected <= candidate;
|
|
51
|
+
end if;
|
|
52
|
+
end if;
|
|
53
|
+
end process;
|
|
54
|
+
end behave;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../microwatt/wishbone_bram_tb.vhdl
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
-- generated by Vertigo VHDL tool
|
|
2
|
+
library ieee;
|
|
3
|
+
use ieee.std_logic_1164.all;
|
|
4
|
+
use ieee.numeric_std.all;
|
|
5
|
+
library work;
|
|
6
|
+
use work.wishbone_types.all;
|
|
7
|
+
|
|
8
|
+
entity wishbone_bram_tb is
|
|
9
|
+
end entity wishbone_bram_tb;
|
|
10
|
+
|
|
11
|
+
architecture behave of wishbone_bram_tb is
|
|
12
|
+
signal clk : std_ulogic;
|
|
13
|
+
signal rst : std_ulogic := '1';
|
|
14
|
+
constant clk_period : time := 10 ns;
|
|
15
|
+
signal w_in : wishbone_slave_out;
|
|
16
|
+
signal w_out : wishbone_master_out;
|
|
17
|
+
|
|
18
|
+
function to_adr(a : integer) return std_ulogic_vector is
|
|
19
|
+
begin
|
|
20
|
+
return std_ulogic_vector(to_unsigned(a,w_out.adr'length));
|
|
21
|
+
end function to_adr;
|
|
22
|
+
begin
|
|
23
|
+
|
|
24
|
+
simple_ram_0 : entity work.wishbone_bram_wrapper
|
|
25
|
+
port map(
|
|
26
|
+
clk => clk,
|
|
27
|
+
rst => rst,
|
|
28
|
+
wishbone_out => w_in,
|
|
29
|
+
wishbone_in => w_out);
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
clock : process
|
|
33
|
+
begin
|
|
34
|
+
clk <= '1';
|
|
35
|
+
wait clk_period / 2;
|
|
36
|
+
clk <= '0';
|
|
37
|
+
wait clk_period / 2;
|
|
38
|
+
end process;
|
|
39
|
+
|
|
40
|
+
stim : process
|
|
41
|
+
begin
|
|
42
|
+
w_out.adr <= (others => '0');
|
|
43
|
+
w_out.dat <= (others => '0');
|
|
44
|
+
w_out.cyc <= '0';
|
|
45
|
+
w_out.stb <= '0';
|
|
46
|
+
w_out.sel <= (others => '0');
|
|
47
|
+
w_out.we <= '0';
|
|
48
|
+
wait rising_edge(clk);
|
|
49
|
+
rst <= '0';
|
|
50
|
+
wait rising_edge(clk);
|
|
51
|
+
w_out.cyc <= '1';
|
|
52
|
+
w_out.stb <= '1';
|
|
53
|
+
w_out.sel <= "11111111";
|
|
54
|
+
w_out.adr <= to_adr(0);
|
|
55
|
+
assert w_in.ack = '0';
|
|
56
|
+
wait rising_edge(clk);
|
|
57
|
+
w_out.stb <= '0';
|
|
58
|
+
wait rising_edge(clk);
|
|
59
|
+
wait rising_edge(clk);
|
|
60
|
+
assert w_in.ack = '1';
|
|
61
|
+
assert w_in.dat(63 downto 0) = x"0706050403020100"
|
|
62
|
+
report to_hstring(w_in.dat);
|
|
63
|
+
wait rising_edge(clk);
|
|
64
|
+
assert w_in.ack = '0';
|
|
65
|
+
w_out.stb <= '1';
|
|
66
|
+
w_out.sel <= "11111111";
|
|
67
|
+
w_out.adr <= to_adr(8);
|
|
68
|
+
assert w_in.ack = '0';
|
|
69
|
+
wait rising_edge(clk);
|
|
70
|
+
w_out.stb <= '0';
|
|
71
|
+
wait rising_edge(clk);
|
|
72
|
+
wait rising_edge(clk);
|
|
73
|
+
assert w_in.ack = '1';
|
|
74
|
+
assert w_in.dat(63 downto 0) = x"0f0e0d0c0b0a0908"
|
|
75
|
+
report to_hstring(w_in.dat);
|
|
76
|
+
wait rising_edge(clk);
|
|
77
|
+
assert w_in.ack = '0';
|
|
78
|
+
w_out.stb <= '1';
|
|
79
|
+
w_out.sel <= "00000001";
|
|
80
|
+
w_out.adr <= to_adr(0);
|
|
81
|
+
w_out.we <= '1';
|
|
82
|
+
w_out.dat(7 downto 0) <= x"0f";
|
|
83
|
+
assert w_in.ack = '0';
|
|
84
|
+
wait rising_edge(clk);
|
|
85
|
+
w_out.stb <= '0';
|
|
86
|
+
wait rising_edge(clk) and w_in.ack = '1';
|
|
87
|
+
wait rising_edge(clk);
|
|
88
|
+
assert w_in.ack = '0';
|
|
89
|
+
w_out.stb <= '1';
|
|
90
|
+
w_out.sel <= "11111111";
|
|
91
|
+
w_out.adr <= to_adr(0);
|
|
92
|
+
w_out.we <= '0';
|
|
93
|
+
assert w_in.ack = '0';
|
|
94
|
+
wait rising_edge(clk);
|
|
95
|
+
w_out.stb <= '0';
|
|
96
|
+
wait rising_edge(clk);
|
|
97
|
+
wait rising_edge(clk);
|
|
98
|
+
assert w_in.ack = '1';
|
|
99
|
+
assert w_in.dat(63 downto 0) = x"070605040302010f"
|
|
100
|
+
report to_hstring(w_in.dat);
|
|
101
|
+
wait rising_edge(clk);
|
|
102
|
+
assert w_in.ack = '0';
|
|
103
|
+
w_out.stb <= '1';
|
|
104
|
+
w_out.sel <= "11110000";
|
|
105
|
+
w_out.adr <= to_adr(0);
|
|
106
|
+
w_out.we <= '1';
|
|
107
|
+
w_out.dat(63 downto 32) <= x"baadfeed";
|
|
108
|
+
assert w_in.ack = '0';
|
|
109
|
+
wait rising_edge(clk);
|
|
110
|
+
w_out.stb <= '0';
|
|
111
|
+
wait rising_edge(clk) and w_in.ack = '1';
|
|
112
|
+
wait rising_edge(clk);
|
|
113
|
+
assert w_in.ack = '0';
|
|
114
|
+
w_out.stb <= '1';
|
|
115
|
+
w_out.sel <= "11111111";
|
|
116
|
+
w_out.adr <= to_adr(0);
|
|
117
|
+
w_out.we <= '0';
|
|
118
|
+
assert w_in.ack = '0';
|
|
119
|
+
wait rising_edge(clk);
|
|
120
|
+
w_out.stb <= '0';
|
|
121
|
+
wait rising_edge(clk);
|
|
122
|
+
wait rising_edge(clk);
|
|
123
|
+
assert w_in.ack = '1';
|
|
124
|
+
assert w_in.dat(63 downto 0) = x"baadfeed0302010f"
|
|
125
|
+
report to_hstring(w_in.dat);
|
|
126
|
+
wait rising_edge(clk);
|
|
127
|
+
assert w_in.ack = '0';
|
|
128
|
+
w_out.stb <= '1';
|
|
129
|
+
w_out.sel <= "11111111";
|
|
130
|
+
w_out.adr <= to_adr(8);
|
|
131
|
+
w_out.we <= '1';
|
|
132
|
+
w_out.dat(63 downto 0) <= x"0001020304050607";
|
|
133
|
+
assert w_in.ack = '0';
|
|
134
|
+
wait rising_edge(clk);
|
|
135
|
+
w_out.stb <= '0';
|
|
136
|
+
wait rising_edge(clk) and w_in.ack = '1';
|
|
137
|
+
wait rising_edge(clk);
|
|
138
|
+
assert w_in.ack = '0';
|
|
139
|
+
w_out.stb <= '1';
|
|
140
|
+
w_out.sel <= "11111111";
|
|
141
|
+
w_out.adr <= to_adr(8);
|
|
142
|
+
w_out.we <= '0';
|
|
143
|
+
assert w_in.ack = '0';
|
|
144
|
+
wait rising_edge(clk);
|
|
145
|
+
w_out.stb <= '0';
|
|
146
|
+
wait rising_edge(clk);
|
|
147
|
+
wait rising_edge(clk);
|
|
148
|
+
assert w_in.ack = '1';
|
|
149
|
+
assert w_in.dat(63 downto 0) = x"0001020304050607"
|
|
150
|
+
report to_hstring(w_in.dat);
|
|
151
|
+
wait rising_edge(clk);
|
|
152
|
+
assert w_in.ack = '0';
|
|
153
|
+
assert false
|
|
154
|
+
report "end of test" severity failure;
|
|
155
|
+
wait ;
|
|
156
|
+
end process;
|
|
157
|
+
end behave;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../microwatt/wishbone_bram_wrapper.vhdl
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
-- generated by Vertigo VHDL tool
|
|
2
|
+
library ieee;
|
|
3
|
+
use ieee.std_logic_1164.all;
|
|
4
|
+
use ieee.numeric_std.all;
|
|
5
|
+
use std.textio.all;
|
|
6
|
+
library work;
|
|
7
|
+
use work.utils.all;
|
|
8
|
+
use work.wishbone_types.all;
|
|
9
|
+
|
|
10
|
+
entity wishbone_bram_wrapper is
|
|
11
|
+
generic(
|
|
12
|
+
memory_size : natural4096 := 4096;
|
|
13
|
+
ram_init_file : string);
|
|
14
|
+
port(
|
|
15
|
+
clk : in std_logic;
|
|
16
|
+
rst : in std_logic;
|
|
17
|
+
wishbone_in : in wishbone_master_out;
|
|
18
|
+
wishbone_out : out wishbone_slave_out);
|
|
19
|
+
end entity wishbone_bram_wrapper;
|
|
20
|
+
|
|
21
|
+
architecture behaviour of wishbone_bram_wrapper is
|
|
22
|
+
constant ram_addr_bits : integer := log2ceil(memory_size) - 3;
|
|
23
|
+
signal ram_addr : std_logic_vector(ram_addr_bits - 1 downto 0);
|
|
24
|
+
signal ram_we : std_ulogic;
|
|
25
|
+
signal ram_re : std_ulogic;
|
|
26
|
+
signal ack : std_ulogic;
|
|
27
|
+
signal ack_buf : std_ulogic;
|
|
28
|
+
begin
|
|
29
|
+
|
|
30
|
+
ram_0 : entity work.main_bram
|
|
31
|
+
port map(
|
|
32
|
+
clk => clk,
|
|
33
|
+
addr => ram_addr,
|
|
34
|
+
di => wishbone_in.dat,
|
|
35
|
+
do => wishbone_out.dat,
|
|
36
|
+
sel => wishbone_in.sel,
|
|
37
|
+
re => ram_re,
|
|
38
|
+
we => ram_we);
|
|
39
|
+
|
|
40
|
+
ram_addr <= wishbone_in.adr(ram_addr_bits + 2 downto 3);
|
|
41
|
+
ram_we <= wishbone_in.stb and wishbone_in.cyc and wishbone_in.we;
|
|
42
|
+
ram_re <= wishbone_in.stb and wishbone_in.cyc and wishbone_in.we;
|
|
43
|
+
wishbone_out.stall <= '0';
|
|
44
|
+
wishbone_out.ack <= ack_buf;
|
|
45
|
+
|
|
46
|
+
wb_0 : process(clk)
|
|
47
|
+
begin
|
|
48
|
+
if rising_edge(clk) then
|
|
49
|
+
if rst = '1' or wishbone_in.cyc = '0' then
|
|
50
|
+
ack_buf <= '0';
|
|
51
|
+
ack <= '0';
|
|
52
|
+
else
|
|
53
|
+
if ram_we = '1' and ack = '0' then
|
|
54
|
+
ack_buf <= '1';
|
|
55
|
+
else
|
|
56
|
+
ack <= wishbone_in.stb;
|
|
57
|
+
ack_buf <= ack;
|
|
58
|
+
end if;
|
|
59
|
+
end if;
|
|
60
|
+
end if;
|
|
61
|
+
end process;
|
|
62
|
+
end behaviour;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../microwatt/wishbone_debug_master.vhdl
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
-- generated by Vertigo VHDL tool
|
|
2
|
+
library ieee;
|
|
3
|
+
use ieee.std_logic_1164.all;
|
|
4
|
+
use ieee.numeric_std.all;
|
|
5
|
+
library work;
|
|
6
|
+
use work.wishbone_types.all;
|
|
7
|
+
|
|
8
|
+
entity wishbone_debug_master is
|
|
9
|
+
port(
|
|
10
|
+
clk : in std_ulogic;
|
|
11
|
+
rst : in std_ulogic;
|
|
12
|
+
dmi_addr : in std_ulogic_vector(1 downto 0);
|
|
13
|
+
dmi_din : in std_ulogic_vector(63 downto 0);
|
|
14
|
+
dmi_dout : out std_ulogic_vector(63 downto 0);
|
|
15
|
+
dmi_req : in std_ulogic;
|
|
16
|
+
dmi_wr : in std_ulogic;
|
|
17
|
+
dmi_ack : out std_ulogic;
|
|
18
|
+
wb_out : out wishbone_master_out;
|
|
19
|
+
wb_in : in wishbone_slave_out);
|
|
20
|
+
end entity wishbone_debug_master;
|
|
21
|
+
|
|
22
|
+
architecture behaviour of wishbone_debug_master is
|
|
23
|
+
constant dbg_wb_addr : std_ulogic_vector(1 downto 0) := "00";
|
|
24
|
+
constant dbg_wb_data : std_ulogic_vector(1 downto 0) := "01";
|
|
25
|
+
constant dbg_wb_ctrl : std_ulogic_vector(1 downto 0) := "10";
|
|
26
|
+
constant dbg_wb_rsvd : std_ulogic_vector(1 downto 0) := "11";
|
|
27
|
+
signal reg_addr : std_ulogic_vector(63 downto 0);
|
|
28
|
+
signal reg_ctrl_out : std_ulogic_vector(63 downto 0);
|
|
29
|
+
signal reg_ctrl : std_ulogic_vector(10 downto 0);
|
|
30
|
+
signal data_latch : std_ulogic_vector(63 downto 0);
|
|
31
|
+
|
|
32
|
+
type state_t is (idle,wb_cycle,dmi_wait);
|
|
33
|
+
signal state : state_t;
|
|
34
|
+
begin
|
|
35
|
+
|
|
36
|
+
with dmi_addr select dmi_dout <=
|
|
37
|
+
reg_addr when dbg_wb_addr,
|
|
38
|
+
data_latch when dbg_wb_data,
|
|
39
|
+
reg_ctrl_out when dbg_wb_ctrl,
|
|
40
|
+
(others => '0') when others,;
|
|
41
|
+
|
|
42
|
+
reg_write : process(clk)
|
|
43
|
+
|
|
44
|
+
subtype autoinc_inc_t is integer range 1 to 8;
|
|
45
|
+
|
|
46
|
+
function decode_autoinc(c : std_ulogic_vector(1 downto 0)) return autoinc_inc_t is
|
|
47
|
+
begin
|
|
48
|
+
case c is
|
|
49
|
+
when "00" =>
|
|
50
|
+
return 1;
|
|
51
|
+
when "01" =>
|
|
52
|
+
return 2;
|
|
53
|
+
when "10" =>
|
|
54
|
+
return 4;
|
|
55
|
+
when "11" =>
|
|
56
|
+
return 8;
|
|
57
|
+
when others =>
|
|
58
|
+
return 8;
|
|
59
|
+
end case;
|
|
60
|
+
end function decode_autoinc;
|
|
61
|
+
begin
|
|
62
|
+
if rising_edge(clk) then
|
|
63
|
+
if (rst) then
|
|
64
|
+
reg_addr <= (others => '0');
|
|
65
|
+
reg_ctrl <= (others => '0');
|
|
66
|
+
else
|
|
67
|
+
if dmi_req and dmi_wr then
|
|
68
|
+
if dmi_addr = dbg_wb_addr then
|
|
69
|
+
reg_addr <= dmi_din;
|
|
70
|
+
elsif dmi_addr = dbg_wb_ctrl then
|
|
71
|
+
reg_ctrl <= dmi_din(10 downto 0);
|
|
72
|
+
end if;
|
|
73
|
+
elsif state = wb_cycle and (wb_in.ack and reg_ctrl(8)) = '1' then
|
|
74
|
+
reg_addr <= std_ulogic_vector(unsigned(reg_addr) + decode_autoinc(reg_ctrl(10 downto 9)));
|
|
75
|
+
end if;
|
|
76
|
+
end if;
|
|
77
|
+
end if;
|
|
78
|
+
end process;
|
|
79
|
+
dmi_ack <= dmi_req when (dmi_addr /= dbg_wb_data or state = dmi_wait) else '0';
|
|
80
|
+
wb_out.adr <= reg_addr(wb_out.adr'left downto 0);
|
|
81
|
+
wb_out.dat <= dmi_din;
|
|
82
|
+
wb_out.sel <= reg_ctrl(7 downto 0);
|
|
83
|
+
wb_out.we <= dmi_wr;
|
|
84
|
+
wb_out.cyc <= '1' when state = wb_cycle else '0';
|
|
85
|
+
|
|
86
|
+
latch_reads : process(clk)
|
|
87
|
+
begin
|
|
88
|
+
if rising_edge(clk) then
|
|
89
|
+
if state = wb_cycle and wb_in.ack = '1' and dmi_wr = '0' then
|
|
90
|
+
data_latch <= wb_in.dat;
|
|
91
|
+
end if;
|
|
92
|
+
end if;
|
|
93
|
+
end process;
|
|
94
|
+
|
|
95
|
+
wb_trigger : process(clk)
|
|
96
|
+
begin
|
|
97
|
+
if rising_edge(clk) then
|
|
98
|
+
if (rst) then
|
|
99
|
+
state <= idle;
|
|
100
|
+
wb_out.stb <= '0';
|
|
101
|
+
else
|
|
102
|
+
case state is
|
|
103
|
+
when idle =>
|
|
104
|
+
if dmi_req = '1' and dmi_addr = dbg_wb_data then
|
|
105
|
+
state <= wb_cycle;
|
|
106
|
+
wb_out.stb <= '1';
|
|
107
|
+
end if;
|
|
108
|
+
when wb_cycle =>
|
|
109
|
+
if wb_in.stall = '0' then
|
|
110
|
+
wb_out.stb <= '0';
|
|
111
|
+
end if;
|
|
112
|
+
if wb_in.ack then
|
|
113
|
+
wb_out.stb <= '0';
|
|
114
|
+
state <= dmi_wait;
|
|
115
|
+
end if;
|
|
116
|
+
when dmi_wait =>
|
|
117
|
+
if dmi_req = '0' then
|
|
118
|
+
state <= idle;
|
|
119
|
+
end if;
|
|
120
|
+
end case;
|
|
121
|
+
end if;
|
|
122
|
+
end if;
|
|
123
|
+
end process;
|
|
124
|
+
end behaviour;
|