OpenCores
URL https://opencores.org/ocsvn/tinycpu/tinycpu/trunk

Subversion Repositories tinycpu

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /tinycpu/trunk
    from Rev 11 to Rev 12
    Reverse comparison

Rev 11 → Rev 12

/testbench/registerfile_tb.vhd
1,7 → 1,8
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
use work.tinycpu.all;
 
ENTITY registerfile_tb IS
END registerfile_tb;
10,35 → 11,21
-- Component Declaration for the Unit Under Test (UUT)
component registerfile
port(
Write1:in std_logic_vector(7 downto 0); --what should be put into the write register
Write2: in std_logic_vector(7 downto 0);
SelRead1:in std_logic_vector(3 downto 0); --select which register to read
SelRead2: in std_logic_vector(3 downto 0); --select second register to read
SelWrite1:in std_logic_vector(3 downto 0); --select which register to write
SelWrite2:in std_logic_vector(3 downto 0);
UseWrite1:in std_logic; --if the register should actually be written to
UseWrite2: in std_logic;
Clock:in std_logic;
Read1:out std_logic_vector(7 downto 0); --register to be read output
Read2:out std_logic_vector(7 downto 0) --register to be read on second output
port(
WriteEnable: in regwritetype;
DataIn: in regdatatype;
Clock: in std_logic;
DataOut: out regdatatype
);
end component;
 
--Inputs
signal Write1 : std_logic_vector(7 downto 0) := (others => '0');
signal Write2 : std_logic_vector(7 downto 0) := (others => '0');
signal SelRead1: std_logic_vector(3 downto 0) := (others => '0');
signal SelRead2: std_logic_vector(3 downto 0) := (others => '0');
signal SelWrite1: std_logic_vector(3 downto 0) := (others => '0');
signal SelWrite2: std_logic_vector(3 downto 0) := (others => '0');
signal UseWrite1: std_logic := '0';
signal UseWrite2: std_logic := '0';
signal WriteEnable : regwritetype := (others => '0');
signal DataIn: regdatatype := (others => "00000000");
 
--Outputs
signal Read1 : std_logic_vector(7 downto 0);
signal Read2 : std_logic_vector(7 downto 0);
signal DataOut: regdatatype := (others => "00000000");
 
signal Clock: std_logic;
constant clock_period : time := 10 ns;
47,17 → 34,10
 
-- Instantiate the Unit Under Test (UUT)
uut: registerfile PORT MAP (
Write1 => Write1,
Write2 => Write2,
SelRead1 => SelRead1,
SelRead2 => SelRead2,
SelWrite1 => SelWrite1,
SelWrite2 => SelWrite2,
UseWrite1 => UseWrite1,
UseWrite2 => UseWrite2,
WriteEnable => WriteEnable,
DataIn => DataIn,
Clock => Clock,
Read1 => Read1,
Read2 => Read2
DataOut => DataOut
);
 
-- Clock process definitions
80,58 → 60,37
wait for clock_period*10;
 
-- case 1
SelWrite1 <= "0000";
Write1 <= "11110000";
UseWrite1 <= '1';
WriteEnable(1) <= '1';
DataIn(1) <= "11110000";
wait for 10 ns;
SelRead1 <= "0000";
UseWrite1 <= '0';
WriteEnable(1) <= '0';
wait for 10 ns;
assert (Read1="11110000") report "Storage error case 1" severity error;
assert (DataOut(1)="11110000") report "Storage error case 1" severity error;
 
-- case 2
SelWrite1 <= "1000";
Write1 <= "11110001";
UseWrite1 <= '1';
WriteEnable(5) <= '1';
DataIn(5) <= "11110001";
wait for 10 ns;
SelRead1 <= "1000";
UseWrite1 <= '0';
WriteEnable(5) <= '0';
wait for 10 ns;
assert (Read1="11110001") report "Storage selector error case 2" severity error;
assert (DataOut(5)="11110001") report "Storage selector error case 2" severity error;
 
-- case 3
SelRead1 <= "0000";
UseWrite1 <= '0';
-- case 3;
wait for 10 ns;
assert (Read1="11110000") report "Storage selector(remembering) error case 3" severity error;
assert (DataOut(1)="11110000") report "Storage selector(remembering) error case 3" severity error;
--case 4
SelWrite1 <= x"0";
SelWrite2 <= x"1";
Write1 <= x"12";
Write2 <= x"34";
UseWrite1 <= '1';
UseWrite2 <= '1';
DataIn(0) <= x"12";
DataIn(1) <= x"34";
WriteEnable(0) <= '1';
WriteEnable(1) <= '1';
wait for 10 ns;
UseWrite1 <= '0';
UseWrite2 <= '0';
SelRead1 <= x"0";
SelRead2 <= x"1";
DataIn(0) <= x"90";
WriteEnable(0) <= '0';
WriteEnable(1) <= '0';
wait for 10 ns;
assert (Read1=x"12" and Read2=x"34") report "simultaneous write and read error case 4" severity error;
assert (DataOut(0)=x"12" and DataOut(1)=x"34") report "simultaneous write and read error case 4" severity error;
 
SelWrite1 <= x"0";
SelWrite2 <= x"0";
Write1 <= x"ff";
Write2 <= x"00";
UseWrite1 <= '1';
UseWrite2 <= '1';
wait for 10 ns;
SelRead1 <= x"0";
UseWrite1 <= '0';
UseWrite2 <= '0';
wait for 10 ns;
assert (Read1=x"ff") report "dual-write error handling error case 5" severity error;
 
 
 
/src/registerfile.vhd
1,5 → 1,5
--registerfile module
--16 registers, dual port for both read and write
--16 registers, read/write port for all registers.
--8 bit registers
 
library IEEE;
6,40 → 6,35
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use ieee.std_logic_unsigned.all;
use work.tinycpu.all;
 
entity registerfile is
port(
Write1:in std_logic_vector(7 downto 0); --what should be put into the write register
Write2: in std_logic_vector(7 downto 0);
SelRead1:in std_logic_vector(3 downto 0); --select which register to read
SelRead2: in std_logic_vector(3 downto 0); --select second register to read
SelWrite1:in std_logic_vector(3 downto 0); --select which register to write
SelWrite2:in std_logic_vector(3 downto 0);
UseWrite1:in std_logic; --if the register should actually be written to
UseWrite2: in std_logic;
Clock:in std_logic;
Read1:out std_logic_vector(7 downto 0); --register to be read output
Read2:out std_logic_vector(7 downto 0) --register to be read on second output
WriteEnable: in regwritetype;
DataIn: in regdatatype;
Clock: in std_logic;
DataOut: out regdatatype
);
end registerfile;
 
architecture Behavioral of registerfile is
type registerstype is array(0 to 15) of std_logic_vector(7 downto 0);
signal registers: registerstype;
--attribute ram_style : string;
--attribute ram_style of registers: signal is "distributed";
begin
writereg: process(Write1, Write2, SelWrite1, SelWrite2, UseWrite1, UseWrite2, Clock)
begin
if(UseWrite1='1') then
if(rising_edge(clock)) then
registers(conv_integer(SelWrite1)) <= Write1;
end if;
end if;
if(UseWrite2='1') then
if(rising_edge(clock) and conv_integer(SelWrite1)/=conv_integer(SelWrite2)) then
registers(conv_integer(SelWrite2)) <= Write2;
end if;
end if;
end process;
Read1 <= registers(conv_integer(SelRead1));
Read2 <= registers(conv_integer(SelRead2));
regs:
for I in 0 to 15 generate
process(WriteEnable(I), DataIn(I), Clock)
begin
if rising_edge(Clock) then
if(WriteEnable(I) = '1') then
registers(I) <= DataIn(I);
end if;
end if;
end process;
DataOut(I) <= registers(I);
end generate regs;
end Behavioral;
/Makefile
34,10 → 34,10
@mv $(TESTBENCH) simulation/$(TESTBENCH)
run :
@$(SIMDIR)/$(TESTBENCH) $(GHDL_SIM_OPT) --vcdgz=$(SIMDIR)/$(TESTBENCH).vcdgz
@$(SIMDIR)/$(TESTBENCH) $(GHDL_SIM_OPT) --wave=$(SIMDIR)/$(TESTBENCH).ghw
view :
gunzip --stdout $(SIMDIR)/$(TESTBENCH).vcdgz | $(WAVEFORM_VIEWER) --vcd
$(WAVEFORM_VIEWER) --dump=$(SIMDIR)/$(TESTBENCH).ghw
clean :
$(GHDL_CMD) --clean --workdir=simulation

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.