aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna/bug084/mod5.vhdl
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/gna/bug084/mod5.vhdl')
-rw-r--r--testsuite/gna/bug084/mod5.vhdl137
1 files changed, 137 insertions, 0 deletions
diff --git a/testsuite/gna/bug084/mod5.vhdl b/testsuite/gna/bug084/mod5.vhdl
new file mode 100644
index 000000000..57ee1819d
--- /dev/null
+++ b/testsuite/gna/bug084/mod5.vhdl
@@ -0,0 +1,137 @@
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity mod5 is
+ generic (
+ NBITS: natural := 13
+ );
+ port (
+ clk: in std_logic;
+ dividend: in std_logic_vector (NBITS - 1 downto 0);
+ load: in std_logic;
+ remzero: out std_logic
+ );
+end entity;
+
+architecture foo of mod5 is
+ type remains is (r0, r1, r2, r3, r4); -- remainder values
+ type remain_array is array (NBITS downto 0) of remains;
+ signal remaindr: remain_array := (others => r0);
+ type branch is array (remains, bit) of remains;
+-- Dave Tweeds state transition table:
+ constant br_table: branch := ( r0 => ('0' => r0, '1' => r1),
+ r1 => ('0' => r2, '1' => r3),
+ r2 => ('0' => r4, '1' => r0),
+ r3 => ('0' => r1, '1' => r2),
+ r4 => ('0' => r3, '1' => r4)
+ );
+begin
+
+do_ig:
+ process (dividend)
+ variable tbit: bit_vector(NBITS - 1 downto 0);
+ variable remaind: remain_array := (others => r0);
+ begin
+do_mod:
+ for i in NBITS - 1 downto 0 loop
+ tbit := to_bitvector(dividend);
+ remaind(i) := br_table(remaind(i + 1),tbit(i));
+ end loop;
+ remaindr <= remaind; -- all values for waveform display
+ end process;
+
+remainders:
+ process (clk)
+ begin
+ if rising_edge(clk) then
+ if remaindr(0) = r0 then
+ remzero <= '1';
+ else
+ remzero <= '0';
+ end if;
+ end if;
+ end process;
+end architecture;
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity mod5_tb is
+end entity;
+
+architecture foo of mod5_tb is
+ constant NBITS: integer range 0 to 13 := 8;
+ signal clk: std_logic := '0';
+ signal dividend: std_logic_vector (NBITS - 1 downto 0);
+ signal load: std_logic := '0';
+
+ signal remzero: std_logic;
+
+ signal psample: std_ulogic;
+ signal sample: std_ulogic;
+ signal done: boolean;
+begin
+DUT:
+ entity work.mod5
+ generic map (NBITS)
+ port map (
+ clk => clk,
+ dividend => dividend,
+ load => load,
+ remzero => remzero
+ );
+CLOCK:
+ process
+ begin
+ wait for 5 ns;
+ clk <= not clk;
+ if done'delayed(30 ns) then
+ wait;
+ end if;
+ end process;
+STIMULI:
+ process
+ begin
+ for i in 0 to 2 ** NBITS - 1 loop
+ wait for 10 ns;
+ dividend <= std_logic_vector(to_unsigned(i,NBITS));
+ wait for 10 ns;
+ load <= '1';
+ wait for 10 ns;
+ load <= '0';
+ end loop;
+ wait for 15 ns;
+ done <= true;
+ wait;
+ end process;
+
+SAMPLER:
+ process (clk)
+ begin
+ if rising_edge(clk) then
+ psample <= load;
+ sample <= psample;
+ end if;
+ end process;
+
+MONITOR:
+ process (sample)
+ variable i: integer;
+ variable rem5: integer;
+ begin
+ if rising_edge (sample) then
+ i := to_integer(unsigned(dividend));
+ rem5 := i mod 5;
+ if rem5 = 0 and remzero /= '1' then
+ assert rem5 = 0 and remzero = '1'
+ report LF & HT &
+ "i = " & integer'image(i) &
+ " rem 5 expected " & integer'image(rem5) &
+ " remzero = " & std_ulogic'image(remzero)
+ SEVERITY ERROR;
+ end if;
+ end if;
+ end process;
+
+end architecture; \ No newline at end of file