git-svn-id: http://moon:8086/svn/vhdl/trunk@1424 cc03376c-175c-47c8-b038-4cd826a8556b
172 lines
5.3 KiB
VHDL
172 lines
5.3 KiB
VHDL
--------------------------------------------------------------------------
|
|
--
|
|
-- Copyright (C) 1993, Peter J. Ashenden
|
|
-- Mail: Dept. Computer Science
|
|
-- University of Adelaide, SA 5005, Australia
|
|
-- e-mail: petera@cs.adelaide.edu.au
|
|
--
|
|
-- This program is free software; you can redistribute it and/or modify
|
|
-- it under the terms of the GNU General Public License as published by
|
|
-- the Free Software Foundation; either version 1, or (at your option)
|
|
-- any later version.
|
|
--
|
|
-- This program is distributed in the hope that it will be useful,
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
-- GNU General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU General Public License
|
|
-- along with this program; if not, write to the Free Software
|
|
-- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
--
|
|
--------------------------------------------------------------------------
|
|
--
|
|
-- $RCSfile: dlx_bus_monitor-behaviour.vhdl,v $ $Revision: 2.1 $ $Date: 1993/10/31 22:36:40 $
|
|
--
|
|
--------------------------------------------------------------------------
|
|
--
|
|
-- Behavioural architecture of DLX bus monitor
|
|
--
|
|
|
|
|
|
use std.textio.all,
|
|
work.dlx_instr.all,
|
|
work.images.image_hex;
|
|
|
|
|
|
architecture behaviour of dlx_bus_monitor is
|
|
|
|
begin
|
|
|
|
monitor : if enable generate
|
|
|
|
enabled_monitor : process
|
|
|
|
variable write_command, instr_fetch : boolean;
|
|
variable L : line;
|
|
|
|
begin
|
|
monitor_loop : loop
|
|
--
|
|
-- wait for a command, valid on leading edge of phi2
|
|
--
|
|
wait until phi2 = '1' and mem_enable = '1';
|
|
--
|
|
-- capture the command information
|
|
--
|
|
write_command := write_enable = '1';
|
|
instr_fetch := ifetch = '1';
|
|
write(L, tag);
|
|
write(L, string'(": "));
|
|
if write_command then
|
|
write(L, string'("D-write to "));
|
|
elsif instr_fetch then
|
|
write(L, string'("I-fetch from "));
|
|
else
|
|
write(L, string'("D-read from "));
|
|
end if;
|
|
write(L, image_hex(a));
|
|
if verbose then
|
|
case width is
|
|
when width_word =>
|
|
write(L, string'(", word"));
|
|
when width_halfword =>
|
|
write(L, string'(", halfword"));
|
|
when width_byte =>
|
|
write(L, string'(", byte"));
|
|
end case;
|
|
if burst = '1' then
|
|
write(L, string'(", burst "));
|
|
else
|
|
write(L, string'(", single "));
|
|
end if;
|
|
writeline(output, L);
|
|
else
|
|
if not instr_fetch then
|
|
write(L, string'(", data"));
|
|
else
|
|
writeline(output, L);
|
|
end if;
|
|
end if;
|
|
--
|
|
burst_loop : loop
|
|
if write_command then
|
|
if verbose then
|
|
write(L, tag);
|
|
write(L, string'(": Write data "));
|
|
write(L, image_hex(d));
|
|
writeline(output, L);
|
|
else
|
|
write(L, ' ');
|
|
write(L, image_hex(d));
|
|
end if;
|
|
end if;
|
|
-- wait for the response from memory
|
|
loop
|
|
wait until phi2 = '0';
|
|
if reset = '1' then
|
|
exit monitor_loop;
|
|
end if;
|
|
exit when ready = '1';
|
|
end loop;
|
|
if write_command then
|
|
if verbose then
|
|
write(L, tag);
|
|
write(L, string'(": Ready"));
|
|
writeline(output, L);
|
|
end if;
|
|
elsif instr_fetch then
|
|
if verbose then
|
|
write(L, tag);
|
|
write(L, string'(": Ready, instruction "));
|
|
write(L, image_hex(d));
|
|
write(L, string'(" [ "));
|
|
write_instr(L, d);
|
|
write(L, string'(" ]"));
|
|
writeline(output, L);
|
|
else -- brief instruction fetch
|
|
write(L, tag);
|
|
write(L, string'(": "));
|
|
write(L, image_hex(d));
|
|
write(L, string'(" [ "));
|
|
write_instr(L, d);
|
|
write(L, string'(" ]"));
|
|
writeline(output, L);
|
|
end if;
|
|
else -- data fetch
|
|
if verbose then
|
|
write(L, tag);
|
|
write(L, string'(": Ready, data "));
|
|
write(L, image_hex(d));
|
|
writeline(output, L);
|
|
else -- brief data fetch
|
|
write(L, ' ');
|
|
write(L, image_hex(d));
|
|
end if;
|
|
end if;
|
|
exit burst_loop when burst = '0';
|
|
end loop burst_loop;
|
|
--
|
|
if not verbose and not instr_fetch then
|
|
writeline(output, L);
|
|
end if;
|
|
end loop monitor_loop;
|
|
--
|
|
-- get here when reset is asserted
|
|
--
|
|
assert reset = '1'
|
|
report "reset code reached with reset = '0'" severity error;
|
|
write(L, string'("DLX_bus_monitor: Reset"));
|
|
writeline(output, L);
|
|
wait until phi2 = '0' and reset = '0';
|
|
write(L, string'("DLX_bus_monitor: End Reset"));
|
|
writeline(output, L);
|
|
--
|
|
-- process monitor now starts again from beginning
|
|
--
|
|
end process enabled_monitor;
|
|
|
|
end generate;
|
|
|
|
end behaviour;
|