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/core.vhdl
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../microwatt/core_debug.vhdl
|
|
@@ -0,0 +1,104 @@
|
|
|
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.common.all;
|
|
7
|
+
|
|
8
|
+
entity core_debug is
|
|
9
|
+
port(
|
|
10
|
+
clk : in std_logic;
|
|
11
|
+
rst : in std_logic;
|
|
12
|
+
dmi_addr : in std_ulogic_vector(3 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
|
+
core_stop : out std_ulogic;
|
|
19
|
+
core_rst : out std_ulogic;
|
|
20
|
+
icache_rst : out std_ulogic;
|
|
21
|
+
terminate : in std_ulogic;
|
|
22
|
+
core_stopped : in std_ulogic;
|
|
23
|
+
nia : in std_ulogic_vector(63 downto 0);
|
|
24
|
+
terminated_out : out std_ulogic);
|
|
25
|
+
end entity core_debug;
|
|
26
|
+
|
|
27
|
+
architecture behave of core_debug is
|
|
28
|
+
signal dmi_req_1 : std_ulogic;
|
|
29
|
+
constant dbg_core_ctrl : std_ulogic_vector(3 downto 0) := "0000";
|
|
30
|
+
constant dbg_core_ctrl_stop : integer := 0;
|
|
31
|
+
constant dbg_core_ctrl_reset : integer := 1;
|
|
32
|
+
constant dbg_core_ctrl_icreset : integer := 2;
|
|
33
|
+
constant dbg_core_ctrl_step : integer := 3;
|
|
34
|
+
constant dbg_core_ctrl_start : integer := 4;
|
|
35
|
+
constant dbg_core_stat : std_ulogic_vector(3 downto 0) := "0001";
|
|
36
|
+
constant dbg_core_stat_stopping : integer := 0;
|
|
37
|
+
constant dbg_core_stat_stopped : integer := 1;
|
|
38
|
+
constant dbg_core_stat_term : integer := 2;
|
|
39
|
+
constant dbg_core_nia : std_ulogic_vector(3 downto 0) := "0010";
|
|
40
|
+
signal stat_reg : std_ulogic_vector(63 downto 0);
|
|
41
|
+
signal stopping : std_ulogic;
|
|
42
|
+
signal do_step : std_ulogic;
|
|
43
|
+
signal do_reset : std_ulogic;
|
|
44
|
+
signal do_icreset : std_ulogic;
|
|
45
|
+
signal terminated : std_ulogic;
|
|
46
|
+
begin
|
|
47
|
+
|
|
48
|
+
dmi_ack <= dmi_req;
|
|
49
|
+
stat_reg <= (2 => terminated,1 => core_stopped,0 => stopping,others => '0');
|
|
50
|
+
with dmi_addr select dmi_dout <=
|
|
51
|
+
stat_reg when dbg_core_stat,
|
|
52
|
+
nia when dbg_core_nia,
|
|
53
|
+
(others => '0') when others,;
|
|
54
|
+
|
|
55
|
+
reg_write : process(clk)
|
|
56
|
+
begin
|
|
57
|
+
if rising_edge(clk) then
|
|
58
|
+
do_step <= '0';
|
|
59
|
+
do_reset <= '0';
|
|
60
|
+
do_icreset <= '0';
|
|
61
|
+
if (rst) then
|
|
62
|
+
stopping <= '0';
|
|
63
|
+
terminated <= '0';
|
|
64
|
+
else
|
|
65
|
+
dmi_req_1 <= dmi_req;
|
|
66
|
+
if dmi_req = '1' and dmi_req_1 = '0' then
|
|
67
|
+
if dmi_wr = '1' then
|
|
68
|
+
report ("dmi write to " & to_hstring(dmi_addr));
|
|
69
|
+
if dmi_addr = dbg_core_ctrl then
|
|
70
|
+
if dmi_din(dbg_core_ctrl_reset) = '1' then
|
|
71
|
+
do_reset <= '1';
|
|
72
|
+
terminated <= '0';
|
|
73
|
+
end if;
|
|
74
|
+
if dmi_din(dbg_core_ctrl_stop) = '1' then
|
|
75
|
+
stopping <= '1';
|
|
76
|
+
end if;
|
|
77
|
+
if dmi_din(dbg_core_ctrl_step) = '1' then
|
|
78
|
+
do_step <= '1';
|
|
79
|
+
terminated <= '0';
|
|
80
|
+
end if;
|
|
81
|
+
if dmi_din(dbg_core_ctrl_icreset) = '1' then
|
|
82
|
+
do_icreset <= '1';
|
|
83
|
+
end if;
|
|
84
|
+
if dmi_din(dbg_core_ctrl_start) = '1' then
|
|
85
|
+
stopping <= '0';
|
|
86
|
+
terminated <= '0';
|
|
87
|
+
end if;
|
|
88
|
+
end if;
|
|
89
|
+
else
|
|
90
|
+
report ("dmi read from " & to_string(dmi_addr));
|
|
91
|
+
end if;
|
|
92
|
+
end if;
|
|
93
|
+
if terminate = '1' then
|
|
94
|
+
stopping <= '1';
|
|
95
|
+
terminated <= '1';
|
|
96
|
+
end if;
|
|
97
|
+
end if;
|
|
98
|
+
end if;
|
|
99
|
+
end process;
|
|
100
|
+
core_stop <= stopping and do_step;
|
|
101
|
+
core_rst <= do_reset;
|
|
102
|
+
icache_rst <= do_icreset;
|
|
103
|
+
terminated_out <= terminated;
|
|
104
|
+
end behave;
|
|
@@ -0,0 +1,231 @@
|
|
|
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.common.all;
|
|
7
|
+
use work.wishbone_types.all;
|
|
8
|
+
|
|
9
|
+
entity core is
|
|
10
|
+
generic(
|
|
11
|
+
sim : booleanfalse := false;
|
|
12
|
+
disable_flatten : booleanfalse := false;
|
|
13
|
+
ex1_bypass : booleantrue := true);
|
|
14
|
+
port(
|
|
15
|
+
clk : in std_logic;
|
|
16
|
+
rst : in std_logic;
|
|
17
|
+
wishbone_insn_in : in wishbone_slave_out;
|
|
18
|
+
wishbone_insn_out : out wishbone_master_out;
|
|
19
|
+
wishbone_data_in : in wishbone_slave_out;
|
|
20
|
+
wishbone_data_out : out wishbone_master_out;
|
|
21
|
+
dmi_addr : in std_ulogic_vector(3 downto 0);
|
|
22
|
+
dmi_din : in std_ulogic_vector(63 downto 0);
|
|
23
|
+
dmi_dout : out std_ulogic_vector(63 downto 0);
|
|
24
|
+
dmi_req : in std_ulogic;
|
|
25
|
+
dmi_wr : in std_ulogic;
|
|
26
|
+
dmi_ack : out std_ulogic;
|
|
27
|
+
terminated_out : out std_logic);
|
|
28
|
+
end entity core;
|
|
29
|
+
|
|
30
|
+
architecture behave of core is
|
|
31
|
+
signal fetch2_to_decode1 : fetch2todecode1type;
|
|
32
|
+
signal fetch1_to_icache : fetch1toicachetype;
|
|
33
|
+
signal icache_to_fetch2 : icachetofetch2type;
|
|
34
|
+
signal decode1_to_decode2 : decode1todecode2type;
|
|
35
|
+
signal decode2_to_execute1 : decode2toexecute1type;
|
|
36
|
+
signal register_file_to_decode2 : registerfiletodecode2type;
|
|
37
|
+
signal decode2_to_register_file : decode2toregisterfiletype;
|
|
38
|
+
signal writeback_to_register_file : writebacktoregisterfiletype;
|
|
39
|
+
signal decode2_to_cr_file : decode2tocrfiletype;
|
|
40
|
+
signal cr_file_to_decode2 : crfiletodecode2type;
|
|
41
|
+
signal writeback_to_cr_file : writebacktocrfiletype;
|
|
42
|
+
signal execute1_to_writeback : execute1towritebacktype;
|
|
43
|
+
signal execute1_to_fetch1 : execute1tofetch1type;
|
|
44
|
+
signal execute1_to_loadstore1 : execute1toloadstore1type;
|
|
45
|
+
signal loadstore1_to_writeback : loadstore1towritebacktype;
|
|
46
|
+
signal loadstore1_to_dcache : loadstore1todcachetype;
|
|
47
|
+
signal dcache_to_loadstore1 : dcachetoloadstore1type;
|
|
48
|
+
signal fetch1_stall_in : std_ulogic;
|
|
49
|
+
signal icache_stall_out : std_ulogic;
|
|
50
|
+
signal fetch2_stall_in : std_ulogic;
|
|
51
|
+
signal decode1_stall_in : std_ulogic;
|
|
52
|
+
signal decode2_stall_in : std_ulogic;
|
|
53
|
+
signal decode2_stall_out : std_ulogic;
|
|
54
|
+
signal ex1_icache_inval : std_ulogic;
|
|
55
|
+
signal ex1_stall_out : std_ulogic;
|
|
56
|
+
signal ls1_stall_out : std_ulogic;
|
|
57
|
+
signal dcache_stall_out : std_ulogic;
|
|
58
|
+
signal flush : std_ulogic;
|
|
59
|
+
signal complete : std_ulogic;
|
|
60
|
+
signal terminate : std_ulogic;
|
|
61
|
+
signal core_rst : std_ulogic;
|
|
62
|
+
signal icache_rst : std_ulogic;
|
|
63
|
+
signal sim_cr_dump : std_ulogic;
|
|
64
|
+
signal dbg_core_stop : std_ulogic;
|
|
65
|
+
signal dbg_core_rst : std_ulogic;
|
|
66
|
+
signal dbg_icache_rst : std_ulogic;
|
|
67
|
+
signal dbg_core_is_stopped : std_ulogic;
|
|
68
|
+
|
|
69
|
+
function keep_h(disable : boolean) return string is
|
|
70
|
+
begin
|
|
71
|
+
if disable then
|
|
72
|
+
return "yes";
|
|
73
|
+
else
|
|
74
|
+
return "no";
|
|
75
|
+
end if;
|
|
76
|
+
end function keep_h;
|
|
77
|
+
attribute keep_hierarchy : string;
|
|
78
|
+
attribute keep_hierarchy of fetch1_0 : label is keep_h(disable_flatten);
|
|
79
|
+
attribute keep_hierarchy of icache_0 : label is keep_h(disable_flatten);
|
|
80
|
+
attribute keep_hierarchy of fetch2_0 : label is keep_h(disable_flatten);
|
|
81
|
+
attribute keep_hierarchy of decode1_0 : label is keep_h(disable_flatten);
|
|
82
|
+
attribute keep_hierarchy of decode2_0 : label is keep_h(disable_flatten);
|
|
83
|
+
attribute keep_hierarchy of register_file_0 : label is keep_h(disable_flatten);
|
|
84
|
+
attribute keep_hierarchy of cr_file_0 : label is keep_h(disable_flatten);
|
|
85
|
+
attribute keep_hierarchy of execute1_0 : label is keep_h(disable_flatten);
|
|
86
|
+
attribute keep_hierarchy of loadstore1_0 : label is keep_h(disable_flatten);
|
|
87
|
+
attribute keep_hierarchy of dcache_0 : label is keep_h(disable_flatten);
|
|
88
|
+
attribute keep_hierarchy of writeback_0 : label is keep_h(disable_flatten);
|
|
89
|
+
attribute keep_hierarchy of debug_0 : label is keep_h(disable_flatten);
|
|
90
|
+
begin
|
|
91
|
+
|
|
92
|
+
core_rst <= dbg_core_rst or rst;
|
|
93
|
+
fetch1_0 : entity work.fetch1
|
|
94
|
+
port map(
|
|
95
|
+
clk => clk,
|
|
96
|
+
rst => core_rst,
|
|
97
|
+
stall_in => fetch1_stall_in,
|
|
98
|
+
flush_in => flush,
|
|
99
|
+
stop_in => dbg_core_stop,
|
|
100
|
+
e_in => execute1_to_fetch1,
|
|
101
|
+
i_out => fetch1_to_icache);
|
|
102
|
+
|
|
103
|
+
fetch1_stall_in <= icache_stall_out or decode2_stall_out;
|
|
104
|
+
icache_0 : entity work.icache
|
|
105
|
+
port map(
|
|
106
|
+
clk => clk,
|
|
107
|
+
rst => icache_rst,
|
|
108
|
+
i_in => fetch1_to_icache,
|
|
109
|
+
i_out => icache_to_fetch2,
|
|
110
|
+
flush_in => flush,
|
|
111
|
+
stall_out => icache_stall_out,
|
|
112
|
+
wishbone_out => wishbone_insn_out,
|
|
113
|
+
wishbone_in => wishbone_insn_in);
|
|
114
|
+
|
|
115
|
+
icache_rst <= rst or dbg_icache_rst or ex1_icache_inval;
|
|
116
|
+
fetch2_0 : entity work.fetch2
|
|
117
|
+
port map(
|
|
118
|
+
clk => clk,
|
|
119
|
+
rst => core_rst,
|
|
120
|
+
stall_in => fetch2_stall_in,
|
|
121
|
+
flush_in => flush,
|
|
122
|
+
i_in => icache_to_fetch2,
|
|
123
|
+
f_out => fetch2_to_decode1);
|
|
124
|
+
|
|
125
|
+
fetch2_stall_in <= decode2_stall_out;
|
|
126
|
+
decode1_0 : entity work.decode1
|
|
127
|
+
port map(
|
|
128
|
+
clk => clk,
|
|
129
|
+
rst => core_rst,
|
|
130
|
+
stall_in => decode1_stall_in,
|
|
131
|
+
flush_in => flush,
|
|
132
|
+
f_in => fetch2_to_decode1,
|
|
133
|
+
d_out => decode1_to_decode2);
|
|
134
|
+
|
|
135
|
+
decode1_stall_in <= decode2_stall_out;
|
|
136
|
+
decode2_0 : entity work.decode2
|
|
137
|
+
port map(
|
|
138
|
+
clk => clk,
|
|
139
|
+
rst => core_rst,
|
|
140
|
+
stall_in => decode2_stall_in,
|
|
141
|
+
stall_out => decode2_stall_out,
|
|
142
|
+
flush_in => flush,
|
|
143
|
+
complete_in => complete,
|
|
144
|
+
stopped_out => dbg_core_is_stopped,
|
|
145
|
+
d_in => decode1_to_decode2,
|
|
146
|
+
e_out => decode2_to_execute1,
|
|
147
|
+
r_in => register_file_to_decode2,
|
|
148
|
+
r_out => decode2_to_register_file,
|
|
149
|
+
c_in => cr_file_to_decode2,
|
|
150
|
+
c_out => decode2_to_cr_file);
|
|
151
|
+
|
|
152
|
+
decode2_stall_in <= ex1_stall_out or ls1_stall_out;
|
|
153
|
+
register_file_0 : entity work.register_file
|
|
154
|
+
port map(
|
|
155
|
+
clk => clk,
|
|
156
|
+
d_in => decode2_to_register_file,
|
|
157
|
+
d_out => register_file_to_decode2,
|
|
158
|
+
w_in => writeback_to_register_file,
|
|
159
|
+
sim_dump => terminate,
|
|
160
|
+
sim_dump_done => sim_cr_dump);
|
|
161
|
+
|
|
162
|
+
cr_file_0 : entity work.cr_file
|
|
163
|
+
port map(
|
|
164
|
+
clk => clk,
|
|
165
|
+
d_in => decode2_to_cr_file,
|
|
166
|
+
d_out => cr_file_to_decode2,
|
|
167
|
+
w_in => writeback_to_cr_file,
|
|
168
|
+
sim_dump => sim_cr_dump);
|
|
169
|
+
|
|
170
|
+
execute1_0 : entity work.execute1
|
|
171
|
+
port map(
|
|
172
|
+
clk => clk,
|
|
173
|
+
rst => core_rst,
|
|
174
|
+
flush_out => flush,
|
|
175
|
+
stall_out => ex1_stall_out,
|
|
176
|
+
e_in => decode2_to_execute1,
|
|
177
|
+
l_out => execute1_to_loadstore1,
|
|
178
|
+
f_out => execute1_to_fetch1,
|
|
179
|
+
e_out => execute1_to_writeback,
|
|
180
|
+
icache_inval => ex1_icache_inval,
|
|
181
|
+
terminate_out => terminate);
|
|
182
|
+
|
|
183
|
+
loadstore1_0 : entity work.loadstore1
|
|
184
|
+
port map(
|
|
185
|
+
clk => clk,
|
|
186
|
+
rst => core_rst,
|
|
187
|
+
l_in => execute1_to_loadstore1,
|
|
188
|
+
l_out => loadstore1_to_writeback,
|
|
189
|
+
d_out => loadstore1_to_dcache,
|
|
190
|
+
d_in => dcache_to_loadstore1,
|
|
191
|
+
dc_stall => dcache_stall_out,
|
|
192
|
+
stall_out => ls1_stall_out);
|
|
193
|
+
|
|
194
|
+
dcache_0 : entity work.dcache
|
|
195
|
+
port map(
|
|
196
|
+
clk => clk,
|
|
197
|
+
rst => core_rst,
|
|
198
|
+
d_in => loadstore1_to_dcache,
|
|
199
|
+
d_out => dcache_to_loadstore1,
|
|
200
|
+
stall_out => dcache_stall_out,
|
|
201
|
+
wishbone_in => wishbone_data_in,
|
|
202
|
+
wishbone_out => wishbone_data_out);
|
|
203
|
+
|
|
204
|
+
writeback_0 : entity work.writeback
|
|
205
|
+
port map(
|
|
206
|
+
clk => clk,
|
|
207
|
+
e_in => execute1_to_writeback,
|
|
208
|
+
l_in => loadstore1_to_writeback,
|
|
209
|
+
w_out => writeback_to_register_file,
|
|
210
|
+
c_out => writeback_to_cr_file,
|
|
211
|
+
complete_out => complete);
|
|
212
|
+
|
|
213
|
+
debug_0 : entity work.core_debug
|
|
214
|
+
port map(
|
|
215
|
+
clk => clk,
|
|
216
|
+
rst => rst,
|
|
217
|
+
dmi_addr => dmi_addr,
|
|
218
|
+
dmi_din => dmi_din,
|
|
219
|
+
dmi_dout => dmi_dout,
|
|
220
|
+
dmi_req => dmi_req,
|
|
221
|
+
dmi_wr => dmi_wr,
|
|
222
|
+
dmi_ack => dmi_ack,
|
|
223
|
+
core_stop => dbg_core_stop,
|
|
224
|
+
core_rst => dbg_core_rst,
|
|
225
|
+
icache_rst => dbg_icache_rst,
|
|
226
|
+
terminate => terminate,
|
|
227
|
+
core_stopped => dbg_core_is_stopped,
|
|
228
|
+
nia => fetch1_to_icache.nia,
|
|
229
|
+
terminated_out => terminated_out);
|
|
230
|
+
|
|
231
|
+
end behave;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../microwatt/core_tb.vhdl
|
|
@@ -0,0 +1,43 @@
|
|
|
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.common.all;
|
|
7
|
+
use work.wishbone_types.all;
|
|
8
|
+
|
|
9
|
+
entity core_tb is
|
|
10
|
+
end entity core_tb;
|
|
11
|
+
|
|
12
|
+
architecture behave of core_tb is
|
|
13
|
+
signal clk : std_logic;
|
|
14
|
+
signal rst : std_logic;
|
|
15
|
+
constant clk_period : time := 10 ns;
|
|
16
|
+
begin
|
|
17
|
+
|
|
18
|
+
soc0 : entity work.soc
|
|
19
|
+
port map(
|
|
20
|
+
rst => rst,
|
|
21
|
+
system_clk => clk,
|
|
22
|
+
uart0_rxd => '0',
|
|
23
|
+
uart0_txd => open);
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
clk_process : process
|
|
27
|
+
begin
|
|
28
|
+
clk <= '0';
|
|
29
|
+
wait clk_period / 2;
|
|
30
|
+
clk <= '1';
|
|
31
|
+
wait clk_period / 2;
|
|
32
|
+
end process;
|
|
33
|
+
|
|
34
|
+
rst_process : process
|
|
35
|
+
begin
|
|
36
|
+
rst <= '1';
|
|
37
|
+
wait 10 * clk_period;
|
|
38
|
+
rst <= '0';
|
|
39
|
+
wait ;
|
|
40
|
+
end process;
|
|
41
|
+
jtag : entity work.sim_jtag
|
|
42
|
+
|
|
43
|
+
end behave;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../microwatt/countzero.vhdl
|
|
@@ -0,0 +1,120 @@
|
|
|
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
|
+
|
|
7
|
+
entity zero_counter is
|
|
8
|
+
port(
|
|
9
|
+
clk : in std_logic;
|
|
10
|
+
rs : in std_ulogic_vector(63 downto 0);
|
|
11
|
+
count_right : in std_ulogic;
|
|
12
|
+
is_32bit : in std_ulogic;
|
|
13
|
+
result : out std_ulogic_vector(63 downto 0));
|
|
14
|
+
end entity zero_counter;
|
|
15
|
+
|
|
16
|
+
architecture behaviour of zero_counter is
|
|
17
|
+
|
|
18
|
+
type intermediate_result is record
|
|
19
|
+
v16 : std_ulogic_vector(15 downto 0);
|
|
20
|
+
sel_hi : std_ulogic_vector(1 downto 0);
|
|
21
|
+
is_32bit : std_ulogic;
|
|
22
|
+
count_right : std_ulogic;
|
|
23
|
+
end record;
|
|
24
|
+
signal r : intermediate_result;
|
|
25
|
+
signal r_in : intermediate_result;
|
|
26
|
+
|
|
27
|
+
function encoder(v : std_ulogic_vector(3 downto 0);right : std_ulogic) return std_ulogic_vector is
|
|
28
|
+
begin
|
|
29
|
+
if right = '0' then
|
|
30
|
+
if v(3) = '1' then
|
|
31
|
+
return "11";
|
|
32
|
+
elsif v(2) = '1' then
|
|
33
|
+
return "10";
|
|
34
|
+
elsif v(1) = '1' then
|
|
35
|
+
return "01";
|
|
36
|
+
else
|
|
37
|
+
return "00";
|
|
38
|
+
end if;
|
|
39
|
+
else
|
|
40
|
+
if v(0) = '1' then
|
|
41
|
+
return "00";
|
|
42
|
+
elsif v(1) = '1' then
|
|
43
|
+
return "01";
|
|
44
|
+
elsif v(2) = '1' then
|
|
45
|
+
return "10";
|
|
46
|
+
else
|
|
47
|
+
return "11";
|
|
48
|
+
end if;
|
|
49
|
+
end if;
|
|
50
|
+
end function encoder;
|
|
51
|
+
begin
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
zerocounter_0 : process(clk)
|
|
55
|
+
begin
|
|
56
|
+
if rising_edge(clk) then
|
|
57
|
+
r <= r_in;
|
|
58
|
+
end if;
|
|
59
|
+
end process;
|
|
60
|
+
|
|
61
|
+
zerocounter_1 : process(all)
|
|
62
|
+
variable v : intermediate_result;
|
|
63
|
+
variable y : std_ulogic_vector(3 downto 0);
|
|
64
|
+
variable z : std_ulogic_vector(3 downto 0);
|
|
65
|
+
variable sel : std_ulogic_vector(5 downto 0);
|
|
66
|
+
variable v4 : std_ulogic_vector(3 downto 0);
|
|
67
|
+
begin
|
|
68
|
+
z(0) := or(rs(15 downto 0));
|
|
69
|
+
z(1) := or(rs(31 downto 16));
|
|
70
|
+
z(2) := or(rs(47 downto 32));
|
|
71
|
+
z(3) := or(rs(63 downto 48));
|
|
72
|
+
if is_32bit = '0' then
|
|
73
|
+
v.sel_hi := encoder(z,count_right);
|
|
74
|
+
else
|
|
75
|
+
v.sel_hi(1) := '0';
|
|
76
|
+
if count_right = '0' then
|
|
77
|
+
v.sel_hi(0) := z(1);
|
|
78
|
+
else
|
|
79
|
+
v.sel_hi(0) := z(0);
|
|
80
|
+
end if;
|
|
81
|
+
end if;
|
|
82
|
+
case v.sel_hi is
|
|
83
|
+
when "00" =>
|
|
84
|
+
v.v16 := rs(15 downto 0);
|
|
85
|
+
when "01" =>
|
|
86
|
+
v.v16 := rs(31 downto 16);
|
|
87
|
+
when "10" =>
|
|
88
|
+
v.v16 := rs(47 downto 32);
|
|
89
|
+
when others =>
|
|
90
|
+
v.v16 := rs(63 downto 48);
|
|
91
|
+
end case;
|
|
92
|
+
v.is_32bit := is_32bit;
|
|
93
|
+
v.count_right := count_right;
|
|
94
|
+
r_in <= v;
|
|
95
|
+
sel(5 downto 4) := r.sel_hi;
|
|
96
|
+
y(0) := or(r.v16(3 downto 0));
|
|
97
|
+
y(1) := or(r.v16(7 downto 4));
|
|
98
|
+
y(2) := or(r.v16(11 downto 8));
|
|
99
|
+
y(3) := or(r.v16(15 downto 12));
|
|
100
|
+
sel(3 downto 2) := encoder(y,r.count_right);
|
|
101
|
+
case sel(3 downto 2) is
|
|
102
|
+
when "00" =>
|
|
103
|
+
v4 := r.v16(3 downto 0);
|
|
104
|
+
when "01" =>
|
|
105
|
+
v4 := r.v16(7 downto 4);
|
|
106
|
+
when "10" =>
|
|
107
|
+
v4 := r.v16(11 downto 8);
|
|
108
|
+
when others =>
|
|
109
|
+
v4 := r.v16(15 downto 12);
|
|
110
|
+
end case;
|
|
111
|
+
sel(1 downto 0) := encoder(v4,r.count_right);
|
|
112
|
+
if v4 = "0000" then
|
|
113
|
+
result <= x"00000000000000" & '0' & r.is_32bit & r.is_32bit & "00000";
|
|
114
|
+
elsif r.count_right = '0' then
|
|
115
|
+
result <= x"00000000000000" & "00" & (sel(5) and r.is_32bit) & sel(4 downto 0);
|
|
116
|
+
else
|
|
117
|
+
result <= x"00000000000000" & "00" & sel;
|
|
118
|
+
end if;
|
|
119
|
+
end process;
|
|
120
|
+
end behaviour;
|