##// END OF EJS Templates
temp
temp

File last commit:

r100:fc97c34d69e3 martin
r249:279a122aaba5 JC
Show More
sim.vhd
869 lines | 26.5 KiB | text/x-vhdl | VhdlLexer
------------------------------------------------------------------------------
-- This file is a part of the GRLIB VHDL IP LIBRARY
-- Copyright (C) 2003 - 2008, Gaisler Research
-- Copyright (C) 2008 - 2010, Aeroflex Gaisler
--
-- 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 2 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-----------------------------------------------------------------------------
-- Package: sim
-- File: sim.vhd
-- Author: Jiri Gaisler - Gaisler Research
-- Description: Simulation models and functions declarations
------------------------------------------------------------------------------
-- pragma translate_off
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
library grlib;
use grlib.stdlib.all;
use grlib.stdio.all;
use grlib.amba.all;
use grlib.devices.all;
library gaisler;
package sim is
component sram
generic (index : integer := 0; -- Byte lane (0 - 3)
Abits: Positive := 10; -- Default 10 address bits (1 Kbyte)
tacc : integer := 10; -- access time (ns)
fname : string := "ram.dat"; -- File to read from
clear : integer := 0); -- Clear memory
port (
a : in std_logic_vector(abits-1 downto 0);
D : inout std_logic_vector(7 downto 0);
CE1 : in std_logic;
WE : in std_logic;
OE : in std_logic);
end component;
component sram16
generic (
index : integer := 0; -- Byte lane (0 - 3)
abits: Positive := 10; -- Default 10 address bits (1 Kbyte)
echk : integer := 0; -- Generate EDAC checksum
tacc : integer := 10; -- access time (ns)
fname : string := "ram.dat"); -- File to read from
port (
a : in std_logic_vector(abits-1 downto 0);
d : inout std_logic_vector(15 downto 0);
lb : in std_logic;
ub : in std_logic;
ce : in std_logic;
we : in std_ulogic;
oe : in std_ulogic);
end component;
component sramft
generic (index : integer := 0; -- Byte lane (0 - 3)
Abits: Positive := 10; -- Default 10 address bits (1 Kbyte)
tacc : integer := 10; -- access time (ns)
fname : string := "ram.dat"); -- File to read from
port (
a : in std_logic_vector(abits-1 downto 0);
D : inout std_logic_vector(7 downto 0);
CE1 : in std_logic;
WE : in std_logic;
OE : in std_logic);
end component;
procedure hexread(L : inout line; value:out bit_vector);
procedure hexread(L : inout line; value:out std_logic_vector);
function ishex(c : character) return boolean;
function buskeep(signal v : in std_logic_vector) return std_logic_vector;
function buskeep(signal c : in std_logic) return std_logic;
component phy is
generic(
address : integer range 0 to 31 := 0;
extended_regs : integer range 0 to 1 := 1;
aneg : integer range 0 to 1 := 1;
base100_t4 : integer range 0 to 1 := 0;
base100_x_fd : integer range 0 to 1 := 1;
base100_x_hd : integer range 0 to 1 := 1;
fd_10 : integer range 0 to 1 := 1;
hd_10 : integer range 0 to 1 := 1;
base100_t2_fd : integer range 0 to 1 := 1;
base100_t2_hd : integer range 0 to 1 := 1;
base1000_x_fd : integer range 0 to 1 := 0;
base1000_x_hd : integer range 0 to 1 := 0;
base1000_t_fd : integer range 0 to 1 := 1;
base1000_t_hd : integer range 0 to 1 := 1;
rmii : integer range 0 to 1 := 0
);
port(
rstn : in std_logic;
mdio : inout std_logic;
tx_clk : out std_logic;
rx_clk : out std_logic;
rxd : out std_logic_vector(7 downto 0);
rx_dv : out std_logic;
rx_er : out std_logic;
rx_col : out std_logic;
rx_crs : out std_logic;
txd : in std_logic_vector(7 downto 0);
tx_en : in std_logic;
tx_er : in std_logic;
mdc : in std_logic;
gtx_clk : in std_logic
);
end component;
type ata_in_type is record --signals from host to device
csel : std_logic; --cable select
cs : std_logic_vector(1 downto 0); --chip select
--dd : std_logic_vector(15 downto 0); --data bus
dasp : std_logic; --Device active / slave present
da : std_logic_vector(2 downto 0); --device adress
dmack: std_logic; --DMA acknowledge
dior : std_logic; --I/O read strobe
diow : std_logic; --I/O write strobe
reset: std_logic; --Reset
end record;
constant ATAI_RESET_VECTOR : ata_in_type := ('0',(others=>'0'),'0',
(others=>'0'),'0','0','0','0');
type ata_out_type is record --signals from device to host
dmarq: std_logic; --DMA request
intrq: std_logic; --Interrupt request
iordy: std_logic; --I/O ready
pdiag: std_logic; --Passed diagnostics
end record;
constant ATAO_RESET_VECTOR : ata_out_type := ('0','0','1','0');
component ata_device is
generic(sector_length: integer :=512; --in bytes
disk_size: integer :=32; --in sectors
log2_size : integer :=14; --Log2(sector_length*disk_size), abits
Tlr : time := 35 ns;
sramfile : string := "disk.srec"
);
port(
--for convinience, not part of ATA interface
clk : in std_logic;
rst : in std_logic;
--interface to host bus adapter
d : inout std_logic_vector(15 downto 0) := (others=>'Z');
atai : in ata_in_type := ATAI_RESET_VECTOR;
atao : out ata_out_type:= ATAO_RESET_VECTOR);
end component;
procedure leon3_subtest(subtest : integer);
procedure mctrl_subtest(subtest : integer);
procedure gptimer_subtest(subtest : integer);
procedure dsu3_subtest(subtest : integer);
procedure spw_subtest(subtest : integer);
procedure spictrl_subtest(subtest : integer);
procedure i2cmst_subtest(subtest : integer);
procedure uhc_subtest(subtest : integer);
procedure ehc_subtest(subtest : integer);
procedure irqmp_subtest(subtest : integer);
procedure spimctrl_subtest(subtest : integer);
procedure svgactrl_subtest(subtest : integer);
procedure apbps2_subtest(subtest : integer);
procedure i2cslv_subtest(subtest : integer);
procedure grpwm_subtest(subtest : integer);
procedure grgpio_subtest(subtest : integer);
procedure griommu_subtest(subtest : integer);
procedure l4stat_subtest(subtest : integer);
procedure call_subtest(vendorid, deviceid, subtest : integer);
component ahbrep
generic (
hindex : integer := 0;
haddr : integer := 0;
hmask : integer := 16#fff#;
halt : integer := 1);
port (
rst : in std_ulogic;
clk : in std_ulogic;
ahbsi : in ahb_slv_in_type;
ahbso : out ahb_slv_out_type
);
end component;
component i2c_slave_model
port (
scl : inout std_logic;
sda : inout std_logic
);
end component;
component grusbdcsim
generic (
functm : integer range 0 to 1 := 0;
keepclk : integer range 0 to 1 := 0);
port (
rst : in std_ulogic;
clk : out std_ulogic;
d : inout std_logic_vector(7 downto 0);
nxt : out std_ulogic;
stp : in std_ulogic;
dir : out std_ulogic
);
end component;
type grusb_dcl_debug_data is array (0 to 503) of std_logic_vector(7 downto 0);
component grusb_dclsim
generic (
functm : integer range 0 to 1 := 0;
keepclk : integer range 0 to 1 := 0);
port (
rst : in std_ulogic;
clk : out std_ulogic;
d : inout std_logic_vector(7 downto 0);
nxt : out std_ulogic;
stp : in std_ulogic;
dir : out std_ulogic;
delay : in std_ulogic := '0';
dstart : in std_ulogic;
drw : in std_ulogic;
daddr : in std_logic_vector(31 downto 0);
dlen : in std_logic_vector(14 downto 0);
ddi : in grusb_dcl_debug_data;
ddone : out std_ulogic;
ddo : out grusb_dcl_debug_data);
end component;
component ulpi
generic (
LSDEV : boolean := false -- Low-Speed device attached
);
port (
clkout : out std_ulogic;
d : inout std_logic_vector(7 downto 0);
nxt : out std_ulogic;
stp : in std_ulogic;
dir : out std_ulogic;
resetn : in std_ulogic
);
end component;
component utmi
generic (
LSDEV : boolean := false; -- Low-Speed device attached
utmi_dw8 : integer -- Interface data width
);
port (
uclk : out std_ulogic;
xcvrsel : in std_logic_vector(1 downto 0);
termsel : in std_ulogic;
suspendm : in std_ulogic;
opmode : in std_logic_vector(1 downto 0);
txvalid : in std_ulogic;
drvvbus : in std_ulogic;
validho : in std_ulogic;
host : in std_ulogic;
utm_rst : in std_ulogic;
linestate : out std_logic_vector(1 downto 0);
txready : out std_ulogic;
rxvalid : out std_ulogic;
rxactive : out std_ulogic;
rxerror : out std_ulogic;
vbusvalid : out std_ulogic;
validhi : out std_ulogic;
hostdisc : out std_ulogic;
datah : inout std_logic_vector(7 downto 0);
data : inout std_logic_vector(7 downto 0)
);
end component;
component delay_wire
generic(
data_width : integer := 1;
delay_atob : real := 0.0;
delay_btoa : real := 0.0
);
port(
a : inout std_logic_vector(data_width-1 downto 0);
b : inout std_logic_vector(data_width-1 downto 0)
);
end component;
component spi_flash
generic (
ftype : integer := 0; -- Flash type
debug : integer := 0; -- Debug output
fname : string := "prom.srec"; -- File to read from
readcmd : integer := 16#0B#; -- SPI memory device read command
dummybyte : integer := 1;
dualoutput : integer := 0);
port (
sck : in std_ulogic;
di : inout std_logic;
do : inout std_logic;
csn : inout std_logic;
-- Test control inputs
sd_cmd_timeout : in std_ulogic := '0';
sd_data_timeout : in std_ulogic := '0'
);
end component;
component pwm_check
port (
clk : in std_ulogic;
address : in std_logic_vector(21 downto 2);
data : inout std_logic_vector(31 downto 0);
iosn : in std_ulogic;
oen : in std_ulogic;
writen : in std_ulogic;
pwm : in std_logic_vector(15 downto 0)
);
end component;
procedure ps2_device (
signal clk : inout std_logic;
signal data : inout std_logic;
-- Configuration
constant DELAY : in time := 40 us
);
procedure grusb_dcl_read (
signal clk : in std_ulogic;
signal rw : out std_ulogic;
signal start : out std_ulogic;
signal done : in std_ulogic
);
procedure grusb_dcl_write (
signal clk : in std_ulogic;
signal rw : out std_ulogic;
signal start : out std_ulogic;
signal done : in std_ulogic
);
end;
package body sim is
-----------------------------------------------------------------------------
-- Helper functions
-----------------------------------------------------------------------------
function to_xlhz(i : std_logic) return std_logic is
begin
case to_X01Z(i) is
when 'Z' => return('Z');
when '0' => return('L');
when '1' => return('H');
when others => return('X');
end case;
end;
type logic_xlhz_table IS ARRAY (std_logic'LOW TO std_logic'HIGH) OF std_logic;
constant cvt_to_xlhz : logic_xlhz_table := (
'Z', -- 'U'
'Z', -- 'X'
'L', -- '0'
'H', -- '1'
'Z', -- 'Z'
'Z', -- 'W'
'L', -- 'L'
'H', -- 'H'
'Z' -- '-'
);
function buskeep (signal v : in std_logic_vector) return std_logic_vector is
variable res : std_logic_vector(v'range);
begin
for i in v'range loop res(i) := cvt_to_xlhz(v(i)); end loop;
return(res);
end;
function buskeep (signal c : in std_logic) return std_logic is
begin
return(cvt_to_xlhz(c));
end;
procedure char2hex(C: character; result: out bit_vector(3 downto 0);
good: out boolean; report_error: in boolean) is
begin
good := true;
case C is
when '0' => result := x"0";
when '1' => result := x"1";
when '2' => result := X"2";
when '3' => result := X"3";
when '4' => result := X"4";
when '5' => result := X"5";
when '6' => result := X"6";
when '7' => result := X"7";
when '8' => result := X"8";
when '9' => result := X"9";
when 'A' => result := X"A";
when 'B' => result := X"B";
when 'C' => result := X"C";
when 'D' => result := X"D";
when 'E' => result := X"E";
when 'F' => result := X"F";
when 'a' => result := X"A";
when 'b' => result := X"B";
when 'c' => result := X"C";
when 'd' => result := X"D";
when 'e' => result := X"E";
when 'f' => result := X"F";
when others =>
if report_error then
assert false report
"hexread error: read a '" & C & "', expected a hex character (0-F).";
end if;
good := false;
end case;
end;
procedure hexread(L:inout line; value:out bit_vector) is
variable OK: boolean;
variable C: character;
constant NE: integer := value'length/4; --'
variable BV: bit_vector(0 to value'length-1); --'
variable S: string(1 to NE-1);
begin
if value'length mod 4 /= 0 then --'
assert false report
"hexread Error: Trying to read vector " &
"with an odd (non multiple of 4) length";
return;
end if;
loop -- skip white space
read(L,C);
exit when ((C /= ' ') and (C /= CR) and (C /= HT));
end loop;
char2hex(C, BV(0 to 3), OK, false);
if not OK then
return;
end if;
read(L, S, OK);
-- if not OK then
-- assert false report "hexread Error: Failed to read the STRING";
-- return;
-- end if;
for I in 1 to NE-1 loop
char2hex(S(I), BV(4*I to 4*I+3), OK, false);
if not OK then
return;
end if;
end loop;
value := BV;
end hexread;
procedure hexread(L:inout line; value:out std_ulogic_vector) is
variable tmp: bit_vector(value'length-1 downto 0); --'
begin
hexread(L, tmp);
value := TO_X01(tmp);
end hexread;
procedure hexread(L:inout line; value:out std_logic_vector) is
variable tmp: std_ulogic_vector(value'length-1 downto 0); --'
begin
hexread(L, tmp);
value := std_logic_vector(tmp);
end hexread;
function ishex(c:character) return boolean is
variable tmp : bit_vector(3 downto 0);
variable OK : boolean;
begin
char2hex(C, tmp, OK, false);
return OK;
end ishex;
-----------------------------------------------------------------------------
-- Subtest print out
-----------------------------------------------------------------------------
procedure gptimer_subtest(subtest : integer) is
begin
case subtest is
when 0 | 1 | 2 | 3 | 4 | 5 | 6 => print(" timer " & tost(subtest+1));
when 8 => print(" chain mode");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure leon3_subtest(subtest : integer) is
begin
case (subtest mod 16) is
when 3 => print(" CPU#" & (tost(subtest/16)) & " register file");
when 4 => print(" CPU#" & (tost(subtest/16)) & " multiplier");
when 5 => print(" CPU#" & (tost(subtest/16)) & " radix-2 divider");
when 6 => print(" CPU#" & (tost(subtest/16)) & " cache system");
when 7 => print(" CPU#" & (tost(subtest/16)) & " multi-processing");
when 8 => print(" CPU#" & (tost(subtest/16)) & " floating-point unit");
when 9 => print(" CPU#" & (tost(subtest/16)) & " itag cache ram");
when 10 => print(" CPU#" & (tost(subtest/16)) & " dtag cache ram");
when 11 => print(" CPU#" & (tost(subtest/16)) & " idata cache ram");
when 12 => print(" CPU#" & (tost(subtest/16)) & " ddata cache ram");
when 13 => print(" CPU#" & (tost(subtest/16)) & " GRFPU test");
when 14 => print(" CPU#" & (tost(subtest/16)) & " memory management unit");
when 15 => print(" CPU#" & (tost(subtest/16)) & " CASA");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure mctrl_subtest(subtest : integer) is
begin
case subtest is
when 3 => print(" sub-word write");
when 4 => print(" EDAC");
when 5 => print(" write protection");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure dsu3_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" AHB trace buffer memory (0x55555555)");
when 2 => print(" AHB trace buffer memory (0xAAAAAAAA)");
when 3 => print(" AHB trace buffer addressing");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure spw_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" Nominal operation, snooping enabled");
when 2 => print(" Nominal operation, snooping disabled");
when 3 => print(" RMAP packet reception");
when 4 => print(" Time functionality");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure spictrl_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" APB interface reset values");
when 2 => print(" Loopback mode");
when 3 => print(" AM Loopback mode");
when 4 => print(" External device test");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure i2cmst_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" APB interface reset values");
when 2 => print(" Data transfer");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure uhc_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" I/O register reset values");
when 2 => print(" Host Controller Reset");
when 3 => print(" Isochronous IN and OUT");
when 4 => print(" Control OUT, Bulk IN");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure ehc_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" Register reset values");
when 2 => print(" Host Controller Reset");
when 3 => print(" Periodic schedule");
when 4 => print(" Asynchronous schedule");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure irqmp_subtest(subtest : integer) is
begin
case subtest is
when 0 to 15 => print(" Testing internal controller " & tost(subtest));
when 16 => print(" Testing timestamping using GPIO port");
when 17 => print(" Testing watchdog functionality");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure spimctrl_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" Initial values");
when 2 => print(" User mode transfer");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure svgactrl_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" Check available clocks");
when 2 => print(" Draw screen");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure apbps2_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" Transmit test");
when 2 => print(" Receive test");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure i2cslv_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" Register interface");
when 2 => print(" Combined I2CMST/I2CSLV test");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure grpwm_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" Asymmetric PWM test");
when 2 => print(" Symmetric PWM test");
when 3 => print(" Waveform PWM test (asymmetric)");
when 4 => print(" Waveform PWM test (symmetric)");
when others =>
-- 247 - 255 if used for configuring pwm_check
if subtest < 247 then
print(" sub-system test " & tost(subtest));
end if;
end case;
end;
procedure grgpio_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" IN, OUT and DIR registers");
when 2 => print(" Interrupt generation");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure griommu_subtest(subtest : integer) is
begin
case subtest is
when 1 => print(" Register interface");
when 2 => print(" Cache flush");
when 3 => print(" Diagnostic cache accesses");
when 4 => print(" Fault tolerance");
when others => print(" sub-system test " & tost(subtest));
end case;
end;
procedure l4stat_subtest(subtest : integer) is
begin
print(" testing counter " & tost(subtest));
end;
procedure call_subtest(vendorid, deviceid, subtest : integer) is
begin
if vendorid = VENDOR_GAISLER then
case deviceid is
when GAISLER_LEON3 | GAISLER_LEON4 | GAISLER_L2CACHE=> leon3_subtest(subtest);
when GAISLER_FTMCTRL => mctrl_subtest(subtest);
when GAISLER_GPTIMER => gptimer_subtest(subtest);
when GAISLER_LEON3DSU => dsu3_subtest(subtest);
when GAISLER_SPW => spw_subtest(subtest);
when GAISLER_SPICTRL => spictrl_subtest(subtest);
when GAISLER_I2CMST => i2cmst_subtest(subtest);
when GAISLER_UHCI => uhc_subtest(subtest);
when GAISLER_EHCI => ehc_subtest(subtest);
when GAISLER_IRQMP => irqmp_subtest(subtest);
when GAISLER_SPIMCTRL => spimctrl_subtest(subtest);
when GAISLER_SVGACTRL => svgactrl_subtest(subtest);
when GAISLER_APBPS2 => apbps2_subtest(subtest);
when GAISLER_I2CSLV => i2cslv_subtest(subtest);
when GAISLER_PWM => grpwm_subtest(subtest);
when GAISLER_GPIO => grgpio_subtest(subtest);
when GAISLER_GRIOMMU => griommu_subtest(subtest);
when GAISLER_L4STAT => l4stat_subtest(subtest);
when others =>
print (" subtest " & tost(subtest));
end case;
elsif vendorid = VENDOR_ESA then
case deviceid is
when ESA_LEON2 => leon3_subtest(subtest);
when ESA_MCTRL => mctrl_subtest(subtest);
when ESA_TIMER => gptimer_subtest(subtest);
when others =>
print ("subtest " & tost(subtest));
end case;
else
print ("subtest " & tost(subtest));
end if;
end;
-----------------------------------------------------------------------------
-- Simple simulation models
-----------------------------------------------------------------------------
-- Description: Simple "PS/2" device. When the device receives the data
-- 0xAA it will respond with the bytes 0x5A, 0xA5.
-- The argument DELAY is the PS/2 clock period / 2
procedure ps2_device (
signal clk : inout std_logic;
signal data : inout std_logic;
-- Configuration
constant DELAY : in time := 40 us) is
variable d : std_logic_vector(9 downto 0);
begin -- ps2_device
clk <= 'Z'; data <= 'Z';
loop
-- Wait for host request-to-send
wait until clk = '0';
wait until data = '0';
wait until clk /= '0';
wait for DELAY;
-- Generate clock and shift in data
for i in 0 to 9 loop
wait for DELAY/2;
clk <= '0';
wait for DELAY;
clk <= 'Z';
d(i) := data;
wait for DELAY/2;
end loop; -- i = 0
-- Acknowledge data
data <= '0';
wait for DELAY/2;
clk <= '0';
wait for DELAY;
clk <= 'Z'; data <= 'Z';
-- Check parity
assert xorv(d(7 downto 0)) /= d(8)
report "Wrong parity on PS/2 bus" severity warning;
-- Continue if data is not 0xAA
if d(7 downto 0) /= conv_std_logic_vector(16#AA#, 8) then next; end if;
wait for 2*DELAY;
-- Transmit two byte response
d(8) := '1'; d(7 downto 0) := conv_std_logic_vector(16#A5#, 8);
for i in 0 to 1 loop
d(7 downto 0) := d(3 downto 0) & d(7 downto 4);
data <= '0'; clk <= '0';
wait for DELAY;
clk <= 'Z';
for j in 0 to 8 loop
wait for DELAY/2;
data <= d(j);
wait for DELAY/2;
clk <= '0';
wait for DELAY;
clk <= 'Z';
end loop; -- j
-- Stop bit
wait for DELAY/2;
data <= 'Z';
wait for DELAY/2;
clk <= '0';
wait for DELAY;
clk <= 'Z';
-- Insert delay between transmissions
if i = 0 then wait for 2*DELAY; end if;
end loop; -- i
end loop;
end ps2_device;
procedure grusb_dcl_read (
signal clk : in std_ulogic;
signal rw : out std_ulogic;
signal start : out std_ulogic;
signal done : in std_ulogic) is
begin
rw <= '0';
wait until rising_edge(clk);
start <= '1';
wait until rising_edge(done);
start <= '0';
wait until falling_edge(done);
end grusb_dcl_read;
procedure grusb_dcl_write (
signal clk : in std_ulogic;
signal rw : out std_ulogic;
signal start : out std_ulogic;
signal done : in std_ulogic) is
begin
rw <= '1';
wait until rising_edge(clk);
start <= '1';
wait until rising_edge(done);
start <= '0';
wait until falling_edge(done);
end grusb_dcl_write;
end;
-- pragma translate_on