mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-09-03 16:29:25 +02:00
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.
159 lines
3.7 KiB
VHDL
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;
|