Files
iverilog/ivtest/ivltests/system.vhd
T
Stephen Williams cea237b407 Add ivtest to the iverilog source tree
By adding ivtest to the iverilog source tree, it is easier to keep
the regression test synchronized with the source that is being tested.
This should be especially helpful for PRs that add a new feature, and
have a matching ivtest PR with the regression test for that feature.
2022-01-15 10:18:50 -08:00

159 lines
3.7 KiB
VHDL

-- This system does nothing useful
-- It takes input X and this is registered internally
-- It computes x+1 and x+const independently
-- The output is computed as (x+const)-(x+1)=const-1
-- so the higher level modifies C and then C-1 is returned
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity Const_system is
generic (C: in integer := 500);
port (clk, reset: in std_logic;
x: in std_logic_vector (7 downto 0);
y: out std_logic_vector (10 downto 0) );
end Const_system;
library ieee;
use ieee.std_logic_1164.all;
entity Add is
generic (n: integer := 8);
port (a, b: in std_logic_vector (n-1 downto 0);
sum: out std_logic_vector (n-1 downto 0);
cin: in std_logic );
end Add;
library ieee;
use ieee.std_logic_1164.all;
entity Inc is
generic (n: integer := 8);
port (a: in std_logic_vector (n-1 downto 0);
sum: out std_logic_vector (n-1 downto 0)
);
end Inc;
library ieee;
use ieee.std_logic_1164.all;
entity Reg_N is
generic (n: integer := 4);
port (clk, reset: in std_logic;
a: in std_logic_vector (n-1 downto 0);
a_reg: out std_logic_vector (n-1 downto 0) );
end Reg_N;
architecture System_rtl of Const_system is
-- Register component
component Reg_N is
generic (n: integer := 4);
port (clk, reset: in std_logic;
a: in std_logic_vector (n-1 downto 0);
a_reg: out std_logic_vector (n-1 downto 0) );
end component;
-- incrementer component
component Inc is
generic (n: integer := 8);
port (a: in std_logic_vector (n-1 downto 0);
sum: out std_logic_vector (n-1 downto 0)
);
end component;
-- adder component
component Add is
generic (n: integer := 8);
port (a, b: in std_logic_vector (n-1 downto 0);
sum: out std_logic_vector (n-1 downto 0);
cin: in std_logic );
end component;
signal x_int: std_logic_vector (7 downto 0);
signal x_inc: std_logic_vector (7 downto 0);
signal x_sum: std_logic_vector (10 downto 0);
signal x_ext: std_logic_vector (10 downto 0);
signal x_inv: std_logic_vector (10 downto 0);
signal x_dif: std_logic_vector (10 downto 0);
signal zero, one: std_logic;
signal const: std_logic_vector (10 downto 0);
begin
const <= conv_std_logic_vector (C, 11);
-- connstant bit 0, 1
zero <= '0';
one <= '1';
-- registering input X
RegX: Reg_N generic map (n => 8)
port map ( clk => clk, reset => reset, a => x, a_reg => x_int);
-- Incrementing input x_int
incrementer: Inc generic map (n => 8)
port map (a => x_int, sum => x_inc); -- x + 1
-- forming 1's complement of x+1
x_inv <= "111" & not x_inc;
x_ext <= "000" & x_int;
-- adding constant to x_int
addition: Add generic map (n => 11)
port map (a => x_ext, b => const, cin => zero, sum => x_sum); -- x + 1000
-- this should get x+1000-(x+1) = 1000-1 = 999
subtraction: Add generic map (n => 11)
port map (a => x_sum, b => x_inv, cin => one, sum => x_dif);
-- registering output X
RegY: Reg_N generic map (n => 11)
port map ( clk => clk, reset => reset, a => x_dif, a_reg => y);
end System_rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
architecture Add_rtl of Add is
signal cx: std_logic_vector (n downto 0);
begin
cx <= ('0' & a) + ('0' & b) + cin;
sum <= cx (n-1 downto 0);
end Add_rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
architecture Inc_rtl of Inc is
signal cx: std_logic_vector (n downto 0);
begin
cx <= ('0' & a) + '1';
sum <= cx (n-1 downto 0);
end Inc_rtl;
library ieee;
use ieee.std_logic_1164.all;
architecture Reg_rtl of Reg_N is
begin
My_register: process (clk, reset)
begin
if (reset = '1') then
a_reg <= (others => '0');
elsif (clk'event and clk = '1') then
a_reg <= a;
end if;
end process;
end Reg_rtl;