aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna/bug18810/BENCH_OISC_SUBLEQ.vhd
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/gna/bug18810/BENCH_OISC_SUBLEQ.vhd')
-rw-r--r--testsuite/gna/bug18810/BENCH_OISC_SUBLEQ.vhd241
1 files changed, 241 insertions, 0 deletions
diff --git a/testsuite/gna/bug18810/BENCH_OISC_SUBLEQ.vhd b/testsuite/gna/bug18810/BENCH_OISC_SUBLEQ.vhd
new file mode 100644
index 000000000..25b113fe6
--- /dev/null
+++ b/testsuite/gna/bug18810/BENCH_OISC_SUBLEQ.vhd
@@ -0,0 +1,241 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use work.OISC_SUBLEQ_PKG.all;
+
+entity BENCH_OISC_SUBLEQ is
+begin
+end entity BENCH_OISC_SUBLEQ;
+
+architecture BENCH of BENCH_OISC_SUBLEQ is
+
+ signal sPCLK : std_logic := '0';
+ signal sDCLK : std_logic := '0';
+ signal sCLK : std_logic := '0';
+ signal sCLR : std_logic := '1';
+
+ constant cPCLK_CYCLE : time := 1000.0 ns / 250.0; -- NOTE: 250[MHz]
+ constant cDCLK_CYCLE : time := 1000.0 ns / 200.0; -- NOTE: 200[MHz]
+ constant cCLK_CYCLE : time := 1000.0 ns / 150.0; -- NOTE: 150[MHz]
+ constant cCLR_TIME : time := 10*cCLK_CYCLE;
+
+ constant clog2PADDR : integer range 0 to integer'high := 8;
+ constant clog2DADDR : integer range 0 to integer'high := 4;
+ constant cDW : integer range 1 to integer'high := 8;
+
+ type tPIF is record
+ OISC_SUBLEQ_oPINST : std_logic_vector(clog2DADDR+clog2DADDR+clog2PADDR-1 downto 0);
+ end record tPIF;
+ signal sP : tPIF;
+
+ type tP is record
+ OISC_SUBLEQ_iPWE : std_logic;
+ OISC_SUBLEQ_iPADDR : integer range 0 to 2**clog2PADDR-1;
+ OISC_SUBLEQ_iPINST : std_logic_vector(clog2DADDR+clog2DADDR+clog2PADDR-1 downto 0);
+ DONE : std_logic;
+ end record tP;
+ constant cP : tP := (
+ OISC_SUBLEQ_iPWE => '0',
+ OISC_SUBLEQ_iPADDR => 0,
+ OISC_SUBLEQ_iPINST => (clog2DADDR+clog2DADDR+clog2PADDR-1 downto 0 => '0'),
+ DONE => '0'
+ );
+ signal rP : tP := cP;
+
+ type tDIF is record
+ OISC_SUBLEQ_oDDATA : std_logic_vector(cDW-1 downto 0);
+ end record tDIF;
+ signal sD : tDIF;
+
+ type tD is record
+ OISC_SUBLEQ_iDWE : std_logic;
+ OISC_SUBLEQ_iDADDR : integer range 0 to 2**clog2DADDR-1;
+ OISC_SUBLEQ_iDDATA : std_logic_vector(cDW-1 downto 0);
+ DONE : std_logic;
+ end record tD;
+ constant cD : tD := (
+ OISC_SUBLEQ_iDWE => '0',
+ OISC_SUBLEQ_iDADDR => 0,
+ OISC_SUBLEQ_iDDATA => (cDW-1 downto 0 => '0'),
+ DONE => '0'
+ );
+ signal rD : tD := cD;
+
+ type tIF is record
+ OISC_SUBLEQ_oACT : std_logic;
+ OISC_SUBLEQ_oPC : integer range 0 to 2**clog2PADDR-1;
+ OISC_SUBLEQ_oLEQ : std_logic;
+ end record tIF;
+ signal s : tIF;
+
+ type t is record
+ ACT : std_logic;
+ DONE : std_logic;
+ end record t;
+ constant c : t := (
+ ACT => '0',
+ DONE => '0'
+ );
+ signal r : t := c;
+
+begin
+
+ P_sPCLK : process
+ begin
+ sPCLK <= '0'; wait for cPCLK_CYCLE/2;
+ sPCLK <= '1'; wait for cPCLK_CYCLE/2;
+ end process P_sPCLK;
+
+ P_sDCLK : process
+ begin
+ sDCLK <= '0'; wait for cDCLK_CYCLE/2;
+ sDCLK <= '1'; wait for cDCLK_CYCLE/2;
+ end process P_sDCLK;
+
+ P_sCLK : process
+ begin
+ sCLK <= '0'; wait for cCLK_CYCLE/2;
+ sCLK <= '1'; wait for cCLK_CYCLE/2;
+ end process P_sCLK;
+
+ P_sCLR : process
+ begin
+ sCLR <= '1'; wait for cCLR_TIME;
+ sCLR <= '0'; wait;
+ end process P_sCLR;
+
+ B_STIM : block is
+ pure function fINST (
+ iA : integer range 0 to 2**clog2DADDR-1;
+ iB : integer range 0 to 2**clog2DADDR-1;
+ iC : integer range 0 to 2**clog2PADDR-1
+ ) return std_logic_vector is
+ variable vA : std_logic_vector(clog2DADDR-1 downto 0);
+ variable vB : std_logic_vector(clog2DADDR-1 downto 0);
+ variable vC : std_logic_vector(clog2PADDR-1 downto 0);
+ begin
+ vA := std_logic_vector(to_unsigned(iA, clog2DADDR));
+ vB := std_logic_vector(to_unsigned(iB, clog2DADDR));
+ vC := std_logic_vector(to_unsigned(iC, clog2PADDR));
+ return vA & vB & vC;
+ end function fINST;
+
+ constant cD_Z : integer range 0 to 2**clog2DADDR-1 := 0;
+ constant cD_X : integer range 0 to 2**clog2DADDR-1 := 1;
+ constant cD_Y : integer range 0 to 2**clog2DADDR-1 := 2;
+ constant cV_Z : std_logic_vector(cDW-1 downto 0) := std_logic_vector(to_signed( 0, cDW));
+ constant cV_X : std_logic_vector(cDW-1 downto 0) := std_logic_vector(to_signed(12, cDW));
+ constant cV_Y : std_logic_vector(cDW-1 downto 0) := std_logic_vector(to_signed(34, cDW));
+ constant cP_ORG : integer range 0 to 2**clog2PADDR-1 := 0;
+ constant cP_START : integer range 0 to 2**clog2PADDR-1 := cP_ORG+8;
+ constant cP_STOP : integer range 0 to 2**clog2PADDR-1 := 2**clog2PADDR-1;
+ begin
+ P_STIM_P : process
+ begin
+ -- ORG: JMP START = ORG: subleq Z, Z, START
+ rP.OISC_SUBLEQ_iPADDR <= cP_ORG;
+ rP.OISC_SUBLEQ_iPINST <= fINST(cD_Z, cD_Z, cP_START);
+ rP.OISC_SUBLEQ_iPWE <= '1';
+ wait until (rising_edge(sPCLK));
+
+ -- START: ADD X, Y = START: subleq X, Z, START+1
+ -- subleq Z, Y, START+2
+ -- subleq Z, Z, START+3
+ rP.OISC_SUBLEQ_iPADDR <= cP_START;
+ rP.OISC_SUBLEQ_iPINST <= fINST(cD_X, cD_Z, cP_START+1);
+ rP.OISC_SUBLEQ_iPWE <= '1';
+ wait until (rising_edge(sPCLK));
+ rP.OISC_SUBLEQ_iPADDR <= cP_START+1;
+ rP.OISC_SUBLEQ_iPINST <= fINST(cD_Z, cD_Y, cP_START+2);
+ rP.OISC_SUBLEQ_iPWE <= '1';
+ wait until (rising_edge(sPCLK));
+ rP.OISC_SUBLEQ_iPADDR <= cP_START+2;
+ rP.OISC_SUBLEQ_iPINST <= fINST(cD_Z, cD_Z, cP_START+3);
+ rP.OISC_SUBLEQ_iPWE <= '1';
+ wait until (rising_edge(sPCLK));
+
+ -- START+3: JUMP STOP = START+3: subleq Z, Z, STOP
+ rP.OISC_SUBLEQ_iPADDR <= cP_START+3;
+ rP.OISC_SUBLEQ_iPINST <= fINST(cD_Z, cD_Z, cP_STOP);
+ rP.OISC_SUBLEQ_iPWE <= '1';
+ wait until (rising_edge(sPCLK));
+
+ -- STOP: JUMP STOP = STOP: subleq Z, Z, STOP
+ rP.OISC_SUBLEQ_iPADDR <= cP_STOP;
+ rP.OISC_SUBLEQ_iPINST <= fINST(cD_Z, cD_Z, cP_STOP);
+ rP.OISC_SUBLEQ_iPWE <= '1';
+ wait until (rising_edge(sPCLK));
+
+ rP <= cP;
+ rP.DONE <= '1';
+ wait;
+ end process P_STIM_P;
+
+ P_STIM_D : process
+ begin
+ rD.OISC_SUBLEQ_iDADDR <= cD_Z;
+ rD.OISC_SUBLEQ_iDDATA <= cV_Z;
+ rD.OISC_SUBLEQ_iDWE <= '1';
+ wait until (rising_edge(sDCLK));
+
+ rD.OISC_SUBLEQ_iDADDR <= cD_X;
+ rD.OISC_SUBLEQ_iDDATA <= cV_X;
+ rD.OISC_SUBLEQ_iDWE <= '1';
+ wait until (rising_edge(sDCLK));
+
+ rD.OISC_SUBLEQ_iDADDR <= cD_Y;
+ rD.OISC_SUBLEQ_iDDATA <= cV_Y;
+ rD.OISC_SUBLEQ_iDWE <= '1';
+ wait until (rising_edge(sDCLK));
+
+ rD <= cD;
+ rD.DONE <= '1';
+ wait;
+ end process P_STIM_D;
+
+ P_STIM : process
+ begin
+ wait until (rP.DONE = '1' and rD.DONE = '1' and sCLR /= '1');
+ wait until (rising_edge(sCLK));
+
+ r.ACT <= '1';
+ wait until (rising_edge(sCLK));
+
+ wait until (s.OISC_SUBLEQ_oPC = cP_STOP);
+
+ r.ACT <= '0';
+ r.DONE <= '1';
+ wait;
+ end process P_STIM;
+ end block B_STIM;
+
+ U_OISC_SUBLEQ : OISC_SUBLEQ
+ generic map (
+ log2PADDR => clog2PADDR,
+ log2DADDR => clog2DADDR,
+ DW => cDW,
+ ZERO => false,
+ ASYNC => false
+ )
+ port map (
+ iPCLK => sPCLK,
+ iPWE => rP.OISC_SUBLEQ_iPWE,
+ iPADDR => rP.OISC_SUBLEQ_iPADDR,
+ iPINST => rP.OISC_SUBLEQ_iPINST,
+ oPINST => sP.OISC_SUBLEQ_oPINST,
+
+ iDCLK => sDCLK,
+ iDWE => rD.OISC_SUBLEQ_iDWE,
+ iDADDR => rD.OISC_SUBLEQ_iDADDR,
+ iDDATA => rD.OISC_SUBLEQ_iDDATA,
+ oDDATA => sD.OISC_SUBLEQ_oDDATA,
+
+ iCLR => sCLR,
+ iCLK => sCLK,
+ iACT => r.ACT,
+ oACT => s.OISC_SUBLEQ_oACT,
+ oPC => s.OISC_SUBLEQ_oPC,
+ oLEQ => s.OISC_SUBLEQ_oLEQ
+ );
+
+end architecture BENCH;