tb_mc8051_alu_sim.vhd
上传用户:sztwq510
上传日期:2007-04-20
资源大小:209k
文件大小:60k
源码类别:

VHDL/FPGA/Verilog

开发平台:

Matlab

  1. -------------------------------------------------------------------------------
  2. --                                                                           --
  3. --          X       X   XXXXXX    XXXXXX    XXXXXX    XXXXXX      X          --
  4. --          XX     XX  X      X  X      X  X      X  X           XX          --
  5. --          X X   X X  X         X      X  X      X  X          X X          --
  6. --          X  X X  X  X         X      X  X      X  X         X  X          --
  7. --          X   X   X  X          XXXXXX   X      X   XXXXXX      X          --
  8. --          X       X  X         X      X  X      X         X     X          --
  9. --          X       X  X         X      X  X      X         X     X          --
  10. --          X       X  X      X  X      X  X      X         X     X          --
  11. --          X       X   XXXXXX    XXXXXX    XXXXXX    XXXXXX      X          --
  12. --                                                                           --
  13. --                                                                           --
  14. --                       O R E G A N O   S Y S T E M S                       --
  15. --                                                                           --
  16. --                            Design & Consulting                            --
  17. --                                                                           --
  18. -------------------------------------------------------------------------------
  19. --                                                                           --
  20. --         Web:           http://www.oregano.at/                             --
  21. --                                                                           --
  22. --         Contact:       mc8051@oregano.at                                  --
  23. --                                                                           --
  24. -------------------------------------------------------------------------------
  25. --                                                                           --
  26. --  MC8051 - VHDL 8051 Microcontroller IP Core                               --
  27. --  Copyright (C) 2001 OREGANO SYSTEMS                                       --
  28. --                                                                           --
  29. --  This library is free software; you can redistribute it and/or            --
  30. --  modify it under the terms of the GNU Lesser General Public               --
  31. --  License as published by the Free Software Foundation; either             --
  32. --  version 2.1 of the License, or (at your option) any later version.       --
  33. --                                                                           --
  34. --  This library is distributed in the hope that it will be useful,          --
  35. --  but WITHOUT ANY WARRANTY; without even the implied warranty of           --
  36. --  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU        --
  37. --  Lesser General Public License for more details.                          --
  38. --                                                                           --
  39. --  Full details of the license can be found in the file LGPL.TXT.           --
  40. --                                                                           --
  41. --  You should have received a copy of the GNU Lesser General Public         --
  42. --  License along with this library; if not, write to the Free Software      --
  43. --  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  --
  44. --                                                                           --
  45. -------------------------------------------------------------------------------
  46. --
  47. --
  48. --         Author:                 Roland H鰈ler
  49. --
  50. --         Filename:               tb_mc8051_alu_sim.vhd
  51. --
  52. --         Date of Creation:       Mon Aug  9 12:14:48 1999
  53. --
  54. --         Version:                $Revision: 1.4 $
  55. --
  56. --         Date of Latest Version: $Date: 2002/01/07 12:16:57 $
  57. --
  58. --
  59. --         Description: Module level testbench for the mc8051 alu.
  60. --
  61. --
  62. --
  63. --
  64. -------------------------------------------------------------------------------
  65. architecture sim of tb_mc8051_alu is
  66.   -----------------------------------------------------------------------------
  67.   --                                                                         --
  68.   --  IMAGE - Convert a special data type to string                          --
  69.   --                                                                         --
  70.   --  This function uses the STD.TEXTIO.WRITE procedure to convert different --
  71.   --  VHDL data types to a string to be able to output the information via   --
  72.   --  a report statement to the simulator.                                   --
  73.   --  (VHDL'93 provides a dedicated predefinded attribute 'IMAGE)            --
  74.   -----------------------------------------------------------------------------
  75.   function IMAGE (constant tme : time) return string is
  76.     variable v_line : line;
  77.     variable v_tme  : string(1 to 20) := (others => ' ');
  78.   begin
  79.     write(v_line, tme);
  80.     v_tme(v_line.all'range) := v_line.all;
  81.     deallocate(v_line);
  82.     return v_tme;
  83.   end IMAGE;
  84.   function IMAGE (constant nmbr : integer) return string is
  85.     variable v_line : line;
  86.     variable v_nmbr  : string(1 to 11) := (others => ' ');
  87.   begin
  88.     write(v_line, nmbr);
  89.     v_nmbr(v_line.all'range) := v_line.all;
  90.     deallocate(v_line);
  91.     return v_nmbr;
  92.   end IMAGE;
  93.   -----------------------------------------------------------------------------
  94.   
  95.   -----------------------------------------------------------------------------
  96.   --                                                                         --
  97.   --  PROC_DA - Test the combinational decimal adjustement command           --
  98.   --                                                                         --
  99.   --  Procedure to generate all the input data to test the combinational     --
  100.   --  divider command. Furthermore the results are compared with the         --
  101.   --  expected values and the simulation is stopped with an error message    --
  102.   --  if the test failes.                                                    --
  103.   -----------------------------------------------------------------------------
  104.   procedure PROC_DA (
  105.     constant DWIDTH     : in  integer;
  106.     constant PROP_DELAY : in  time;
  107.     signal   s_datao    : out std_logic_vector;
  108.     signal   s_cy       : out std_logic_vector;
  109.     signal   s_datai    : in  std_logic_vector;
  110.     signal   s_cyi      : in  std_logic_vector;
  111.     signal   s_da_end   : out boolean) is
  112.     type t_nibbles is array (0 to ((DWIDTH-1)/4)) of integer;
  113.     variable v_flags     : std_logic_vector((DWIDTH-1)/4 downto 0);
  114.     variable v_flags_int : std_logic_vector((DWIDTH-1)/4 downto 0);
  115.     variable v_newdata   : std_logic_vector(DWIDTH-1 downto 0);
  116.     variable v_tmp       : integer;
  117.     variable v_cy        : std_logic;
  118.     variable v_ext       : boolean;
  119.   begin
  120.     s_da_end <= false;
  121.     s_datao <= conv_std_logic_vector(0,DWIDTH);
  122.     s_cy <= conv_std_logic_vector(0,((DWIDTH-1)/4)+1);
  123.     v_ext := false;
  124.     for j in 0 to 2**DWIDTH-1 loop
  125.       s_datao <= conv_std_logic_vector(j,DWIDTH);
  126.       for i in 0 to 2**(((DWIDTH-1)/4)+1)-1 loop
  127.         -- MSB of v_flags is cy. The rest represents the auxiliary carry flags.
  128.         v_flags := conv_std_logic_vector(i,((DWIDTH-1)/4)+1);
  129.         v_cy := v_flags(v_flags'HIGH);
  130.         s_cy <= conv_std_logic_vector(i,((DWIDTH-1)/4)+1);
  131.         v_tmp := j;
  132.         v_ext := false;
  133.         -- Whenever a flag is set the corresponding data cannot be greater than
  134.         -- 2 (The data is assumed to be the result of an addition of two BCD
  135.         -- numbers). - Just to reduce simulation runtime.
  136.         for r in 0 to (DWIDTH-1)/4 loop
  137.           if j mod 2**((r+1)*4) > 2 and v_flags(r) = '1' then
  138.             v_ext := true;
  139.           end if;
  140.         end loop;  -- r
  141.         next when v_ext = true;
  142.         for h in 0 to (DWIDTH-1)/4 loop
  143.             -- Perform adjustement of the following nibbles
  144.             if v_tmp mod 2**((h+1)*4) > 9*(2**(h*4))+2**(h*4)-1 or
  145.               v_flags(h) = '1' then
  146.               v_flags_int := conv_std_logic_vector(0,((DWIDTH-1)/4)+1);
  147.               for k in h to ((DWIDTH-1)/4) loop
  148.                 if k=h then
  149.                   -- Determine carry flag of the nibble which will be
  150.                   -- incremented by 6.
  151.                   if DWIDTH >= (k+1)*4 then
  152.                     if v_tmp mod 2**((k+1)*4) > 9*(2**(k*4))+2**(k*4)-1 then
  153.                       -- The correction of the nibble needs a carry
  154.                       v_flags_int(k) := '1';
  155.                     end if;
  156.                   elsif DWIDTH = (k+1)*4-1 or DWIDTH = (k+1)*4-2 then
  157.                     if v_tmp mod 2**((k+1)*4) > 1*(2**(k*4))+2**(k*4)-1 then
  158.                       -- The correction of the nibble needs a carry
  159.                       v_flags_int(k) := '1';
  160.                     end if;
  161.                   end if;
  162.                 else
  163.                   -- Determine carry flag of the nibbles subsequent to the one
  164.                   -- which will be incremented by 6.
  165.                   if DWIDTH >= (k+1)*4 then
  166.                     if v_tmp mod 2**((k+1)*4) >= 15*(2**(k*4))
  167.                       and v_flags_int(k-1) = '1' then
  168.                       -- The correction of the nibble needs a carry
  169.                       v_flags_int(k) := '1';
  170.                     end if;
  171.                   else
  172.                     if v_tmp mod 2**DWIDTH >= (2**(DWIDTH-k*4)-1)*2**(k*4)
  173.                       and v_flags_int(k-1) = '1' then
  174.                       -- The correction of the nibble needs a carry
  175.                       v_flags_int(k) := '1';
  176.                     end if;
  177.                   end if;
  178.                 end if;
  179.               end loop;  -- k
  180.               for k in h to ((DWIDTH-1)/4) loop
  181.                 -- Perform correction for the lowest nibble in scope
  182.                 if DWIDTH >= (k+1)*4-1 then
  183.                   if k=h then
  184.                     v_tmp := v_tmp + 6*(2**(h*4));
  185.                   end if;
  186.                 elsif DWIDTH = (k+1)*4-2 then
  187.                   if k=h then
  188.                     v_tmp := v_tmp + 2*(2**(h*4));
  189.                   end if;
  190.                 end if;
  191.               end loop;  -- k
  192.               v_flags := v_flags_int or v_flags;
  193.             end if;
  194.         end loop;  -- h
  195.         -- Set expected values.
  196.         v_newdata := conv_std_logic_vector(v_tmp, DWIDTH);
  197.         if v_tmp > 2**DWIDTH-1 then
  198.           v_cy := '1';
  199.         end if;
  200.         -- After waiting for the result, perform checks.
  201.         wait for PROP_DELAY;
  202.         assert (s_datai = v_newdata) and (s_cyi((DWIDTH-1)/4) = v_cy)
  203.           report "ERROR in decimal adjustement of the "
  204.           & IMAGE(DWIDTH) & " bit data!" &
  205.           " v_tmp= " & IMAGE(v_tmp) &
  206.           " j= "  & IMAGE(j) &
  207.           " i= "  & IMAGE(i)
  208.           severity failure;
  209.       end loop;  -- i
  210.     end loop;  -- j  
  211.     assert false
  212.       report "********* " & IMAGE(DWIDTH)
  213.       & "BIT DECIMAL ADJUST FUNCTION FINISHED AT "
  214.       & IMAGE(now) & " !" & " *********" 
  215.       severity note;
  216.     s_da_end <= true;
  217.     wait;
  218.   end PROC_DA;
  219.   -----------------------------------------------------------------------------
  220.   
  221.   -----------------------------------------------------------------------------
  222.   --                                                                         --
  223.   --  PROC_DIV_ACC_RAM - Test the combinational divider                      --
  224.   --                                                                         --
  225.   --  Procedure to generate all the input data to test the combinational     --
  226.   --  divider command. Furthermore the results are compared with the         --
  227.   --  expected values and the simulation is stopped with an error message    --
  228.   --  if the test failes.                                                    --
  229.   -----------------------------------------------------------------------------
  230.   procedure PROC_DIV_ACC_RAM (
  231.     constant DWIDTH     : in  positive;
  232.     constant PROP_DELAY : in  time;
  233.     signal   s_cyi      : in  std_logic_vector;
  234.     signal   s_ovi      : in  std_logic;
  235.     signal   s_qutnt    : in  std_logic_vector;
  236.     signal   s_rmndr    : in  std_logic_vector;
  237.     signal   s_cyo      : out std_logic_vector;
  238.     signal   s_ovo      : out std_logic;
  239.     signal   s_dvdnd    : out std_logic_vector;
  240.     signal   s_dvsor    : out std_logic_vector;
  241.     signal   s_dvdr_end : out boolean) is
  242.     
  243.     variable v_quot : integer;
  244.     variable v_remd : integer;
  245.     variable v_flags     : std_logic_vector((DWIDTH-1)/4+1 downto 0);
  246.     
  247.   begin
  248.     s_dvdr_end <= false;
  249.     for j in 0 to 2**DWIDTH-1 loop
  250.       s_dvdnd <= conv_std_logic_vector(j,DWIDTH);
  251.       for i in 0 to 2**DWIDTH-1 loop
  252.         s_dvsor <= conv_std_logic_vector(i,DWIDTH);
  253.         for f in 0 to 2**(((DWIDTH-1)/4)+2)-1 loop
  254.           v_flags := conv_std_logic_vector(f,((DWIDTH-1)/4)+2);
  255.           s_cyo <= v_flags(((DWIDTH-1)/4) downto 0);
  256.           s_ovo <= v_flags(v_flags'HIGH);        
  257.           wait for PROP_DELAY;
  258.           if i /= 0 then
  259.             v_quot := j/i;
  260.             v_remd := j rem i;
  261.             assert (s_cyi((DWIDTH-1)/4) = '0')
  262.               and (s_ovi = '0')
  263.               and (s_qutnt = conv_std_logic_vector(v_quot,DWIDTH))
  264.               and (s_rmndr = conv_std_logic_vector(v_remd,DWIDTH))
  265.               report "ERROR in division!"
  266.               severity failure;
  267.           else   
  268.             assert (s_cyi((DWIDTH-1)/4) = '0')
  269.               and (s_ovi = '1')
  270.               report "ERROR in division by zero - flags not correct!"
  271.               severity failure;          
  272.           end if;
  273.         end loop;  -- f
  274.       end loop;  -- i
  275.     end loop;  -- j  
  276.     assert false
  277.       report "********* " & IMAGE(DWIDTH) & "BIT DIVIDER SEQUENCE FINISHED AT "
  278.       & IMAGE(now) & " !" & " *********" 
  279.       severity note;
  280.     s_dvdr_end <= true;
  281.     wait;
  282.   end PROC_DIV_ACC_RAM;
  283.   -----------------------------------------------------------------------------
  284.   -----------------------------------------------------------------------------
  285.   --                                                                         --
  286.   --  PROC_MUL_ACC_RAM - Test the combinational multiplier                   --
  287.   --                                                                         --
  288.   --  Procedure to generate all the input data to test the combinational     --
  289.   --  multiply command. Furthermore the results are compared with the        --
  290.   --  expected values and the simulation is stopped with an error message    --
  291.   --  if the test failes.                                                    --
  292.   -----------------------------------------------------------------------------
  293.   procedure PROC_MUL_ACC_RAM (
  294.     constant DWIDTH     : in  positive;
  295.     constant PROP_DELAY : in  time;
  296.     signal   s_cyi      : in  std_logic_vector;
  297.     signal   s_ovi      : in  std_logic;
  298.     signal   s_product  : in  std_logic_vector;
  299.     signal   s_cyo      : out std_logic_vector;
  300.     signal   s_ovo      : out std_logic;
  301.     signal   s_mltplcnd : out std_logic_vector;
  302.     signal   s_mltplctr : out std_logic_vector;
  303.     signal   s_mul_end  : out boolean) is
  304.     
  305.     variable v_product : integer;
  306.     variable v_flags     : std_logic_vector((DWIDTH-1)/4+1 downto 0);
  307.     
  308.   begin
  309.     s_mul_end <= false;
  310.     for j in 0 to 2**DWIDTH-1 loop
  311.       s_mltplcnd <= conv_std_logic_vector(j,DWIDTH);
  312.       for i in 0 to 2**DWIDTH-1 loop
  313.         s_mltplctr <= conv_std_logic_vector(i,DWIDTH);
  314.         for f in 0 to 2**(((DWIDTH-1)/4)+2)-1 loop
  315.           v_flags := conv_std_logic_vector(f,((DWIDTH-1)/4)+2);
  316.           s_cyo <= v_flags(((DWIDTH-1)/4) downto 0);
  317.           s_ovo <= v_flags(v_flags'HIGH);        
  318.           v_product := j*i;
  319.           wait for PROP_DELAY;
  320.           if v_product > 2**DWIDTH-1 then
  321.             assert (s_cyi((DWIDTH-1)/4) = '0')
  322.               and (s_ovi = '1')
  323.               and (s_product = conv_std_logic_vector(v_product,DWIDTH*2))
  324.               report "ERROR in " & IMAGE(DWIDTH) & "bit multiplication!"
  325.               severity failure;
  326.           else  
  327.             assert (s_cyi((DWIDTH-1)/4) = '0')
  328.               and (s_product = conv_std_logic_vector(v_product,DWIDTH*2))
  329.               and (s_ovi = '0')
  330.               report "ERROR in " & IMAGE(DWIDTH) & "bit multiplication!"
  331.               severity failure;
  332.           end if;
  333.         end loop;  -- f
  334.       end loop;  -- i
  335.     end loop;  -- j  
  336.     assert false
  337.       report "********* " & IMAGE(DWIDTH)
  338.       & "BIT MULTIPLIER SEQUENCE FINISHED AT "
  339.       & IMAGE(now) & " !" & " *********" 
  340.       severity note;
  341.     s_mul_end <= true;
  342.     wait;
  343.   end PROC_MUL_ACC_RAM;
  344.   -----------------------------------------------------------------------------
  345.   
  346.   -----------------------------------------------------------------------------
  347.   --                                                                         --
  348.   --  PROC_AND - Test the logical AND command                                --
  349.   --                                                                         --
  350.   --  Procedure to generate all the input data to test the logical           --
  351.   --  AND command. Furthermore the results are compared with the             --
  352.   --  expected values and the simulation is stopped with an error message    --
  353.   --  if the test failes.                                                    --
  354.   -----------------------------------------------------------------------------
  355.   procedure PROC_AND (
  356.     constant DWIDTH     : in  positive;
  357.     constant PROP_DELAY : in  time;
  358.     signal   s_cyi      : in  std_logic_vector;
  359.     signal   s_ovi      : in  std_logic;
  360.     signal   s_result   : in  std_logic_vector;
  361.     signal   s_cyo      : out std_logic_vector;
  362.     signal   s_ovo      : out std_logic;
  363.     signal   s_operanda : out std_logic_vector;
  364.     signal   s_operandb : out std_logic_vector;
  365.     signal   s_and_end  : out boolean) is
  366.     variable v_result : std_logic_vector(DWIDTH-1 downto 0);
  367.     variable v_flags  : std_logic_vector((DWIDTH-1)/4+1 downto 0);
  368.     variable v_cyo    : std_logic_vector(((DWIDTH-1)/4) downto 0);
  369.     variable v_ovo    : std_logic;
  370.   begin
  371.     s_and_end <= false;
  372.     for j in 0 to 2**DWIDTH-1 loop
  373.       s_operanda <= conv_std_logic_vector(j,DWIDTH);
  374.       for i in 0 to 2**DWIDTH-1 loop
  375.         s_operandb <= conv_std_logic_vector(i,DWIDTH);
  376.         for f in 0 to 2**(((DWIDTH-1)/4)+2)-1 loop
  377.           v_flags := conv_std_logic_vector(f,((DWIDTH-1)/4)+2);
  378.           v_cyo := v_flags(((DWIDTH-1)/4) downto 0);
  379.           v_ovo := v_flags(v_flags'HIGH);
  380.           s_cyo <= v_cyo;
  381.           s_ovo <= v_ovo;
  382.           v_result := conv_std_logic_vector(j,DWIDTH)
  383.                       and conv_std_logic_vector(i,DWIDTH);
  384.           wait for PROP_DELAY;
  385.           assert (s_cyi = v_cyo)
  386.             and (s_ovi = v_ovo)
  387.             and (s_result = v_result)
  388.             report "ERROR in " & IMAGE(DWIDTH) & "bit logical AND operation!"
  389.             severity failure;
  390.         end loop;  -- f
  391.       end loop;  -- i
  392.     end loop;  -- j  
  393.     assert false
  394.       report "********* " & IMAGE(DWIDTH)
  395.       & "BIT AND SEQUENCE FINISHED AT "
  396.       & IMAGE(now) & " !" & " *********" 
  397.       severity note;
  398.     s_and_end <= true;
  399.     wait;
  400.   end PROC_AND;
  401.   -----------------------------------------------------------------------------
  402.   -----------------------------------------------------------------------------
  403.   --                                                                         --
  404.   --  PROC_OR - Test the logical OR command                                  --
  405.   --                                                                         --
  406.   --  Procedure to generate all the input data to test the logical           --
  407.   --  OR command. Furthermore the results are compared with the              --
  408.   --  expected values and the simulation is stopped with an error message    --
  409.   --  if the test failes.                                                    --
  410.   -----------------------------------------------------------------------------
  411.   procedure PROC_OR (
  412.     constant DWIDTH     : in  positive;
  413.     constant PROP_DELAY : in  time;
  414.     signal   s_cyi      : in  std_logic_vector;
  415.     signal   s_ovi      : in  std_logic;
  416.     signal   s_result   : in  std_logic_vector;
  417.     signal   s_cyo      : out std_logic_vector;
  418.     signal   s_ovo      : out std_logic;
  419.     signal   s_operanda : out std_logic_vector;
  420.     signal   s_operandb : out std_logic_vector;
  421.     signal   s_or_end  : out boolean) is
  422.     variable v_result : std_logic_vector(DWIDTH-1 downto 0);
  423.     variable v_flags  : std_logic_vector((DWIDTH-1)/4+1 downto 0);
  424.     variable v_cyo    : std_logic_vector(((DWIDTH-1)/4) downto 0);
  425.     variable v_ovo    : std_logic;
  426.   begin
  427.     s_or_end <= false;
  428.     for j in 0 to 2**DWIDTH-1 loop
  429.       s_operanda <= conv_std_logic_vector(j,DWIDTH);
  430.       for i in 0 to 2**DWIDTH-1 loop
  431.         s_operandb <= conv_std_logic_vector(i,DWIDTH);
  432.         for f in 0 to 2**(((DWIDTH-1)/4)+2)-1 loop
  433.           v_flags := conv_std_logic_vector(f,((DWIDTH-1)/4)+2);
  434.           v_cyo := v_flags(((DWIDTH-1)/4) downto 0);
  435.           v_ovo := v_flags(v_flags'HIGH);
  436.           s_cyo <= v_cyo;
  437.           s_ovo <= v_ovo;
  438.           v_result := conv_std_logic_vector(j,DWIDTH)
  439.                       or conv_std_logic_vector(i,DWIDTH);
  440.           wait for PROP_DELAY;
  441.           assert (s_cyi = v_cyo)
  442.             and (s_ovi = v_ovo)
  443.             and (s_result = v_result)
  444.             report "ERROR in " & IMAGE(DWIDTH) & "bit logical OR operation!"
  445.             severity failure;
  446.         end loop;  -- f
  447.       end loop;  -- i
  448.     end loop;  -- j  
  449.     assert false
  450.       report "********* " & IMAGE(DWIDTH)
  451.       & "BIT OR SEQUENCE FINISHED AT "
  452.       & IMAGE(now) & " !" & " *********" 
  453.       severity note;
  454.     s_or_end <= true;
  455.     wait;
  456.   end PROC_OR;
  457.   -----------------------------------------------------------------------------
  458.   
  459.   -----------------------------------------------------------------------------
  460.   --                                                                         --
  461.   --  PROC_XOR - Test the logical XOR command                                --
  462.   --                                                                         --
  463.   --  Procedure to generate all the input data to test the logical           --
  464.   --  XOR command. Furthermore the results are compared with the             --
  465.   --  expected values and the simulation is stopped with an error message    --
  466.   --  if the test failes.                                                    --
  467.   -----------------------------------------------------------------------------
  468.   procedure PROC_XOR (
  469.     constant DWIDTH     : in  positive;
  470.     constant PROP_DELAY : in  time;
  471.     signal   s_cyi      : in  std_logic_vector;
  472.     signal   s_ovi      : in  std_logic;
  473.     signal   s_result   : in  std_logic_vector;
  474.     signal   s_cyo      : out std_logic_vector;
  475.     signal   s_ovo      : out std_logic;
  476.     signal   s_operanda : out std_logic_vector;
  477.     signal   s_operandb : out std_logic_vector;
  478.     signal   s_xor_end  : out boolean) is
  479.     variable v_result : std_logic_vector(DWIDTH-1 downto 0);
  480.     variable v_flags  : std_logic_vector((DWIDTH-1)/4+1 downto 0);
  481.     variable v_cyo    : std_logic_vector(((DWIDTH-1)/4) downto 0);
  482.     variable v_ovo    : std_logic;
  483.   begin
  484.     s_xor_end <= false;
  485.     for j in 0 to 2**DWIDTH-1 loop
  486.       s_operanda <= conv_std_logic_vector(j,DWIDTH);
  487.       for i in 0 to 2**DWIDTH-1 loop
  488.         s_operandb <= conv_std_logic_vector(i,DWIDTH);
  489.         for f in 0 to 2**(((DWIDTH-1)/4)+2)-1 loop
  490.           v_flags := conv_std_logic_vector(f,((DWIDTH-1)/4)+2);
  491.           v_cyo := v_flags(((DWIDTH-1)/4) downto 0);
  492.           v_ovo := v_flags(v_flags'HIGH);
  493.           s_cyo <= v_cyo;
  494.           s_ovo <= v_ovo;
  495.           v_result := conv_std_logic_vector(j,DWIDTH)
  496.                       xor conv_std_logic_vector(i,DWIDTH);
  497.           wait for PROP_DELAY;
  498.           assert (s_cyi = v_cyo)
  499.             and (s_ovi = v_ovo)
  500.             and (s_result = v_result)
  501.             report "ERROR in " & IMAGE(DWIDTH) & "bit logical XOR operation!"
  502.             severity failure;
  503.         end loop;  -- f
  504.       end loop;  -- i
  505.     end loop;  -- j  
  506.     assert false
  507.       report "********* " & IMAGE(DWIDTH)
  508.       & "BIT XOR SEQUENCE FINISHED AT "
  509.       & IMAGE(now) & " !" & " *********" 
  510.       severity note;
  511.     s_xor_end <= true;
  512.     wait;
  513.   end PROC_XOR;
  514.   -----------------------------------------------------------------------------
  515.   
  516.   -----------------------------------------------------------------------------
  517.   --                                                                         --
  518.   --  PROC_ADD - Test the logical ADD command                                --
  519.   --                                                                         --
  520.   --  Procedure to generate all the input data to test the logical           --
  521.   --  ADD command. Furthermore the results are compared with the             --
  522.   --  expected values and the simulation is stopped with an error message    --
  523.   --  if the test failes.                                                    --
  524.   -----------------------------------------------------------------------------
  525.   procedure PROC_ADD (
  526.     constant DWIDTH     : in  positive;
  527.     constant PROP_DELAY : in  time;
  528.     constant ADD_CARRY  : in  boolean;
  529.     signal   s_cyi      : in  std_logic_vector;
  530.     signal   s_ovi      : in  std_logic;
  531.     signal   s_result   : in  std_logic_vector;
  532.     signal   s_cyo      : out std_logic_vector;
  533.     signal   s_ovo      : out std_logic;
  534.     signal   s_operanda : out std_logic_vector;
  535.     signal   s_operandb : out std_logic_vector;
  536.     signal   s_add_end  : out boolean) is
  537.     variable v_result : std_logic_vector(DWIDTH-1 downto 0);
  538.     variable v_flags  : std_logic_vector((DWIDTH-1)/4+1 downto 0);
  539.     variable v_cyo    : std_logic_vector(((DWIDTH-1)/4) downto 0);
  540.     variable v_ovo    : std_logic;
  541.     variable v_carry  : integer;
  542.   begin
  543.     s_add_end <= false;
  544.     for j in 0 to 2**DWIDTH-1 loop
  545.       s_operanda <= conv_std_logic_vector(j,DWIDTH);
  546.       for i in 0 to 2**DWIDTH-1 loop
  547.         s_operandb <= conv_std_logic_vector(i,DWIDTH);
  548.         for f in 0 to 2**(((DWIDTH-1)/4)+2)-1 loop
  549.           v_flags := conv_std_logic_vector(f,((DWIDTH-1)/4)+2);
  550.           s_cyo <= v_flags(((DWIDTH-1)/4) downto 0);
  551.           s_ovo <= v_flags(v_flags'HIGH);
  552.           v_carry := conv_integer(v_flags((DWIDTH-1)/4));
  553.           if ADD_CARRY = true then
  554.             for h in 0 to (DWIDTH-1)/4 loop
  555.               if DWIDTH > (h+1)*4 then
  556.                 if (j mod 2**((h+1)*4) + i mod 2**((h+1)*4) + v_carry)
  557.                   > 2**((h+1)*4)-1 then  
  558.                   v_cyo(h) := '1';                          
  559.                 else                                        
  560.                   v_cyo(h) := '0';                          
  561.                 end if;
  562.               else
  563.                 if (j mod 2**(DWIDTH) + i mod 2**(DWIDTH) + v_carry
  564.                   > 2**(DWIDTH)-1) then  
  565.                   v_cyo(h) := '1';                          
  566.                 else                                        
  567.                   v_cyo(h) := '0';                          
  568.                 end if;
  569.               end if;
  570.             end loop;  -- h
  571.  --           if DWIDTH = 1 then
  572.  --             v_ovo := '0';
  573.  --           else
  574.               if (j+i > 2**DWIDTH-1
  575.                   and (j mod 2**(DWIDTH-1) + i mod 2**(DWIDTH-1) + v_carry)
  576.                   <= 2**(DWIDTH-1)-1) or
  577.                 (j+i < 2**DWIDTH-1
  578.                  and (j mod 2**(DWIDTH-1) + i mod 2**(DWIDTH-1) + v_carry)
  579.                  > 2**(DWIDTH-1)-1) then
  580.                 v_ovo := '1';                             
  581.               else                                          
  582.                 v_ovo := '0';                               
  583.               end if;                                       
  584.  --           end if;
  585.             v_result := conv_std_logic_vector(j + i + v_carry,DWIDTH);
  586.             wait for PROP_DELAY;
  587.             assert (s_cyi = v_cyo)
  588.               and (s_ovi = v_ovo)
  589.               and (s_result = v_result)
  590.               report "ERROR in " & IMAGE(DWIDTH) & "bit ADDC operation!"
  591.               severity failure;
  592.           else
  593.             for h in 0 to (DWIDTH-1)/4 loop
  594.               if DWIDTH > (h+1)*4 then
  595.                 if (j mod 2**((h+1)*4) + i mod 2**((h+1)*4))
  596.                   > 2**((h+1)*4)-1 then  
  597.                   v_cyo(h) := '1';                          
  598.                 else                                        
  599.                   v_cyo(h) := '0';                          
  600.                 end if;
  601.               else
  602.                 if (j mod 2**(DWIDTH) + i mod 2**(DWIDTH)
  603.                   > 2**(DWIDTH)-1) then  
  604.                   v_cyo(h) := '1';                          
  605.                 else                                        
  606.                   v_cyo(h) := '0';                          
  607.                 end if;
  608.               end if;
  609.             end loop;  -- h
  610.  --           if DWIDTH = 1 then
  611.  --             v_ovo := '0';
  612.  --           else
  613.               if (j+i > 2**DWIDTH-1
  614.                   and (j mod 2**(DWIDTH-1) + i mod 2**(DWIDTH-1))
  615.                   <= 2**(DWIDTH-1)-1) or
  616.                 (j+i <= 2**DWIDTH-1
  617.                  and (j mod 2**(DWIDTH-1) + i mod 2**(DWIDTH-1))
  618.                  > 2**(DWIDTH-1)-1) then
  619.                 v_ovo := '1';                               
  620.               else                                          
  621.                 v_ovo := '0';                               
  622.               end if;                                       
  623.  --           end if;
  624.             v_result := conv_std_logic_vector(j+i,DWIDTH);
  625.             wait for PROP_DELAY;
  626.             assert (s_cyi = v_cyo)
  627.               and (s_ovi = v_ovo)
  628.               and (s_result = v_result)
  629.               report "ERROR in " & IMAGE(DWIDTH) & "bit ADD operation!"
  630.               severity failure;
  631.           end if;
  632.         end loop;  -- f
  633.       end loop;  -- i
  634.     end loop;  -- j  
  635.     assert false
  636.       report "********* " & IMAGE(DWIDTH)
  637.       & "BIT ADD SEQUENCE FINISHED AT "
  638.       & IMAGE(now) & " !" & " *********" 
  639.       severity note;
  640.     s_add_end <= true;
  641.     wait;
  642.   end PROC_ADD;
  643.   -----------------------------------------------------------------------------
  644.   
  645.   -----------------------------------------------------------------------------
  646.   --                                                                         --
  647.   --  PROC_SUB - Test the logical SUB command                                --
  648.   --                                                                         --
  649.   --  Procedure to generate all the input data to test the                   --
  650.   --  SUB command. Furthermore the results are compared with the             --
  651.   --  expected values and the simulation is stopped with an error message    --
  652.   --  if the test failes.                                                    --
  653.   -----------------------------------------------------------------------------
  654.   procedure PROC_SUB (
  655.     constant DWIDTH     : in  positive;
  656.     constant PROP_DELAY : in  time;
  657.     signal   s_cyi      : in  std_logic_vector;
  658.     signal   s_ovi      : in  std_logic;
  659.     signal   s_result   : in  std_logic_vector;
  660.     signal   s_cyo      : out std_logic_vector;
  661.     signal   s_ovo      : out std_logic;
  662.     signal   s_operanda : out std_logic_vector;
  663.     signal   s_operandb : out std_logic_vector;
  664.     signal   s_sub_end  : out boolean) is
  665.     variable v_result : std_logic_vector(DWIDTH-1 downto 0);
  666.     variable v_flags  : std_logic_vector((DWIDTH-1)/4+1 downto 0);
  667.     variable v_cyo    : std_logic_vector(((DWIDTH-1)/4) downto 0);
  668.     variable v_ovo    : std_logic;
  669.     variable v_carry  : integer;
  670.   begin
  671.     s_sub_end <= false;
  672.     for j in 0 to 2**DWIDTH-1 loop
  673.       s_operanda <= conv_std_logic_vector(j,DWIDTH);
  674.       for i in 0 to 2**DWIDTH-1 loop
  675.         s_operandb <= conv_std_logic_vector(i,DWIDTH);
  676.         for f in 0 to 2**(((DWIDTH-1)/4)+2)-1 loop
  677.           v_flags := conv_std_logic_vector(f,((DWIDTH-1)/4)+2);
  678.           s_cyo <= v_flags(((DWIDTH-1)/4) downto 0);
  679.           s_ovo <= v_flags(v_flags'HIGH);
  680.           v_carry := conv_integer(v_flags((DWIDTH-1)/4));
  681.             for h in 0 to (DWIDTH-1)/4 loop
  682.               if DWIDTH > (h+1)*4 then
  683.                 if (j mod 2**((h+1)*4) - i mod 2**((h+1)*4) - v_carry)
  684.                   < 0 then 
  685.                   v_cyo(h) := '1';                          
  686.                 else                                        
  687.                   v_cyo(h) := '0';                          
  688.                 end if;
  689.               else
  690.                 if (j mod 2**(DWIDTH) - i mod 2**(DWIDTH) - v_carry)
  691.                   < 0 then
  692.                   v_cyo(h) := '1';                          
  693.                 else                                        
  694.                   v_cyo(h) := '0';                          
  695.                 end if;
  696.               end if;
  697.             end loop;  -- h
  698.  --           if DWIDTH = 1 then
  699.  --             v_ovo := '0';
  700.  --           else
  701.               if (j - i - v_carry < 0
  702.                   and (j mod 2**(DWIDTH-1) - i mod 2**(DWIDTH-1) - v_carry)
  703.                   >= 0) or 
  704.                 (j - i - v_carry >= 0
  705.                  and (j mod 2**(DWIDTH-1) - i mod 2**(DWIDTH-1) - v_carry)
  706.                  < 0) then
  707.                 v_ovo := '1';                               
  708.               else                                          
  709.                 v_ovo := '0';                               
  710.               end if;                                       
  711.  --           end if;
  712.             v_result := conv_std_logic_vector(j - i - v_carry,DWIDTH);
  713.             wait for PROP_DELAY;
  714.             assert (s_cyi = v_cyo)
  715.               and (s_ovi = v_ovo)
  716.               and (s_result = v_result)
  717.               report "ERROR in " & IMAGE(DWIDTH) & "bit SUB operation!"
  718.               severity failure;
  719.         end loop;  -- f
  720.       end loop;  -- i
  721.     end loop;  -- j  
  722.     assert false
  723.       report "********* " & IMAGE(DWIDTH)
  724.       & "BIT SUB SEQUENCE FINISHED AT "
  725.       & IMAGE(now) & " !" & " *********" 
  726.       severity note;
  727.     s_sub_end <= true;
  728.     wait;
  729.   end PROC_SUB;
  730.   -----------------------------------------------------------------------------
  731.   constant PROP_DELAY : time := 100 ns;
  732.   constant MAX_DWIDTH : integer := 11;
  733.   type t_data_DA is array (1 to MAX_DWIDTH) of
  734.     std_logic_vector(MAX_DWIDTH-1 downto 0);
  735.   type t_cmd_DA is array (1 to MAX_DWIDTH) of std_logic_vector(5 downto 0);
  736.   type t_cy_DA is array (1 to MAX_DWIDTH) of
  737.     std_logic_vector((MAX_DWIDTH-1)/4 downto 0);
  738.   type t_ov_DA is array (1 to MAX_DWIDTH) of std_logic;
  739.   type t_end_DA is array (1 to MAX_DWIDTH) of boolean;
  740.   
  741.   type t_data_DIV_ACC_RAM is array (1 to MAX_DWIDTH) of
  742.     std_logic_vector(MAX_DWIDTH-1 downto 0);
  743.   type t_cmd_DIV_ACC_RAM is array (1 to MAX_DWIDTH) of
  744.     std_logic_vector(5 downto 0);
  745.   type t_ov_DIV_ACC_RAM is array (1 to MAX_DWIDTH) of std_logic;
  746.   type t_end_DIV_ACC_RAM is array (1 to MAX_DWIDTH) of boolean;
  747.   type t_cy_DIV_ACC_RAM is array (1 to MAX_DWIDTH) of
  748.     std_logic_vector((MAX_DWIDTH-1)/4 downto 0);
  749.   type t_product_MUL_ACC_RAM is array (1 to MAX_DWIDTH) of
  750.     std_logic_vector(MAX_DWIDTH*2-1 downto 0);
  751.   type t_data_MUL_ACC_RAM is array (1 to MAX_DWIDTH) of
  752.     std_logic_vector(MAX_DWIDTH-1 downto 0);
  753.   type t_cmd_MUL_ACC_RAM is array (1 to MAX_DWIDTH) of
  754.     std_logic_vector(5 downto 0);
  755.   type t_ov_MUL_ACC_RAM is array (1 to MAX_DWIDTH) of std_logic;
  756.   type t_end_MUL_ACC_RAM is array (1 to MAX_DWIDTH) of boolean;
  757.   type t_cy_MUL_ACC_RAM is array (1 to MAX_DWIDTH) of
  758.     std_logic_vector((MAX_DWIDTH-1)/4 downto 0);
  759.   
  760.   type t_data_STIM is array (1 to MAX_DWIDTH) of
  761.     std_logic_vector(MAX_DWIDTH-1 downto 0);
  762.   type t_cmd_STIM is array (1 to MAX_DWIDTH) of std_logic_vector(5 downto 0);
  763.   type t_cy_STIM is array (1 to MAX_DWIDTH) of
  764.     std_logic_vector((MAX_DWIDTH-1)/4 downto 0);
  765.   type t_ov_STIM is array (1 to MAX_DWIDTH) of std_logic;
  766.   type t_end_STIM is array (1 to MAX_DWIDTH) of boolean;
  767.   type t_pass is array (1 to MAX_DWIDTH+1) of boolean;
  768.   signal rom_data_DA : t_data_DA;
  769.   signal ram_data_DA : t_data_DA;
  770.   signal acc_DA : t_data_DA;
  771.   signal hlp_DA : t_data_DA;
  772.   signal cmd_DA : t_cmd_DA;
  773.   signal cy_DA : t_cy_DA;
  774.   signal ov_DA : t_ov_DA;
  775.   signal new_cy_DA : t_cy_DA;
  776.   signal new_ov_DA : t_ov_DA;
  777.   signal result_a_DA : t_data_DA;
  778.   signal result_b_DA : t_data_DA;
  779.   signal end_DA : t_end_DA;
  780.   signal rom_data_DIV_ACC_RAM : t_data_DIV_ACC_RAM;
  781.   signal ram_data_DIV_ACC_RAM : t_data_DIV_ACC_RAM;
  782.   signal acc_DIV_ACC_RAM : t_data_DIV_ACC_RAM;
  783.   signal hlp_DIV_ACC_RAM : t_data_DIV_ACC_RAM;
  784.   signal cmd_DIV_ACC_RAM : t_cmd_DIV_ACC_RAM;
  785.   signal cy_DIV_ACC_RAM : t_cy_DIV_ACC_RAM;
  786.   signal ov_DIV_ACC_RAM : t_ov_DIV_ACC_RAM;
  787.   signal new_cy_DIV_ACC_RAM : t_cy_DIV_ACC_RAM;
  788.   signal new_ov_DIV_ACC_RAM : t_ov_DIV_ACC_RAM;
  789.   signal result_a_DIV_ACC_RAM : t_data_DIV_ACC_RAM;
  790.   signal result_b_DIV_ACC_RAM : t_data_DIV_ACC_RAM;
  791.   signal end_DIV_ACC_RAM : t_end_DIV_ACC_RAM;
  792.   signal rom_data_MUL_ACC_RAM : t_data_MUL_ACC_RAM;
  793.   signal ram_data_MUL_ACC_RAM : t_data_MUL_ACC_RAM;
  794.   signal acc_MUL_ACC_RAM : t_data_MUL_ACC_RAM;
  795.   signal hlp_MUL_ACC_RAM : t_data_MUL_ACC_RAM;
  796.   signal cmd_MUL_ACC_RAM : t_cmd_MUL_ACC_RAM;
  797.   signal cy_MUL_ACC_RAM : t_cy_MUL_ACC_RAM;
  798.   signal ov_MUL_ACC_RAM : t_ov_MUL_ACC_RAM;
  799.   signal new_cy_MUL_ACC_RAM : t_cy_MUL_ACC_RAM;
  800.   signal new_ov_MUL_ACC_RAM : t_ov_MUL_ACC_RAM;
  801.   signal result_a_MUL_ACC_RAM : t_data_MUL_ACC_RAM;
  802.   signal result_b_MUL_ACC_RAM : t_data_MUL_ACC_RAM;
  803.   signal product_MUL_ACC_RAM : t_product_MUL_ACC_RAM;
  804.   signal end_MUL_ACC_RAM : t_end_MUL_ACC_RAM;
  805.   signal rom_data_AND_ACC_RAM : t_data_STIM;
  806.   signal ram_data_AND_ACC_RAM : t_data_STIM;
  807.   signal acc_AND_ACC_RAM : t_data_STIM;
  808.   signal hlp_AND_ACC_RAM : t_data_STIM;
  809.   signal cmd_AND_ACC_RAM : t_cmd_STIM;
  810.   signal cy_AND_ACC_RAM : t_cy_STIM;
  811.   signal ov_AND_ACC_RAM : t_ov_STIM;
  812.   signal new_cy_AND_ACC_RAM : t_cy_STIM;
  813.   signal new_ov_AND_ACC_RAM : t_ov_STIM;
  814.   signal result_a_AND_ACC_RAM : t_data_STIM;
  815.   signal result_b_AND_ACC_RAM : t_data_STIM;
  816.   signal end_AND_ACC_RAM : t_end_STIM;
  817.   signal rom_data_OR_ACC_RAM : t_data_STIM;
  818.   signal ram_data_OR_ACC_RAM : t_data_STIM;
  819.   signal acc_OR_ACC_RAM : t_data_STIM;
  820.   signal hlp_OR_ACC_RAM : t_data_STIM;
  821.   signal cmd_OR_ACC_RAM : t_cmd_STIM;
  822.   signal cy_OR_ACC_RAM : t_cy_STIM;
  823.   signal ov_OR_ACC_RAM : t_ov_STIM;
  824.   signal new_cy_OR_ACC_RAM : t_cy_STIM;
  825.   signal new_ov_OR_ACC_RAM : t_ov_STIM;
  826.   signal result_a_OR_ACC_RAM : t_data_STIM;
  827.   signal result_b_OR_ACC_RAM : t_data_STIM;
  828.   signal end_OR_ACC_RAM : t_end_STIM;
  829.   signal rom_data_XOR_ACC_RAM : t_data_STIM;
  830.   signal ram_data_XOR_ACC_RAM : t_data_STIM;
  831.   signal acc_XOR_ACC_RAM : t_data_STIM;
  832.   signal hlp_XOR_ACC_RAM : t_data_STIM;
  833.   signal cmd_XOR_ACC_RAM : t_cmd_STIM;
  834.   signal cy_XOR_ACC_RAM : t_cy_STIM;
  835.   signal ov_XOR_ACC_RAM : t_ov_STIM;
  836.   signal new_cy_XOR_ACC_RAM : t_cy_STIM;
  837.   signal new_ov_XOR_ACC_RAM : t_ov_STIM;
  838.   signal result_a_XOR_ACC_RAM : t_data_STIM;
  839.   signal result_b_XOR_ACC_RAM : t_data_STIM;
  840.   signal end_XOR_ACC_RAM : t_end_STIM;
  841.   signal rom_data_ADD_ACC_RAM : t_data_STIM;
  842.   signal ram_data_ADD_ACC_RAM : t_data_STIM;
  843.   signal acc_ADD_ACC_RAM : t_data_STIM;
  844.   signal hlp_ADD_ACC_RAM : t_data_STIM;
  845.   signal cmd_ADD_ACC_RAM : t_cmd_STIM;
  846.   signal cy_ADD_ACC_RAM : t_cy_STIM;
  847.   signal ov_ADD_ACC_RAM : t_ov_STIM;
  848.   signal new_cy_ADD_ACC_RAM : t_cy_STIM;
  849.   signal new_ov_ADD_ACC_RAM : t_ov_STIM;
  850.   signal result_a_ADD_ACC_RAM : t_data_STIM;
  851.   signal result_b_ADD_ACC_RAM : t_data_STIM;
  852.   signal end_ADD_ACC_RAM : t_end_STIM;
  853.   
  854.   signal rom_data_ADDC_ACC_RAM : t_data_STIM;
  855.   signal ram_data_ADDC_ACC_RAM : t_data_STIM;
  856.   signal acc_ADDC_ACC_RAM : t_data_STIM;
  857.   signal hlp_ADDC_ACC_RAM : t_data_STIM;
  858.   signal cmd_ADDC_ACC_RAM : t_cmd_STIM;
  859.   signal cy_ADDC_ACC_RAM : t_cy_STIM;
  860.   signal ov_ADDC_ACC_RAM : t_ov_STIM;
  861.   signal new_cy_ADDC_ACC_RAM : t_cy_STIM;
  862.   signal new_ov_ADDC_ACC_RAM : t_ov_STIM;
  863.   signal result_a_ADDC_ACC_RAM : t_data_STIM;
  864.   signal result_b_ADDC_ACC_RAM : t_data_STIM;
  865.   signal end_ADDC_ACC_RAM : t_end_STIM;
  866.   
  867.   signal rom_data_SUB_ACC_RAM : t_data_STIM;
  868.   signal ram_data_SUB_ACC_RAM : t_data_STIM;
  869.   signal acc_SUB_ACC_RAM : t_data_STIM;
  870.   signal hlp_SUB_ACC_RAM : t_data_STIM;
  871.   signal cmd_SUB_ACC_RAM : t_cmd_STIM;
  872.   signal cy_SUB_ACC_RAM : t_cy_STIM;
  873.   signal ov_SUB_ACC_RAM : t_ov_STIM;
  874.   signal new_cy_SUB_ACC_RAM : t_cy_STIM;
  875.   signal new_ov_SUB_ACC_RAM : t_ov_STIM;
  876.   signal result_a_SUB_ACC_RAM : t_data_STIM;
  877.   signal result_b_SUB_ACC_RAM : t_data_STIM;
  878.   signal end_SUB_ACC_RAM : t_end_STIM;
  879.   signal pass : t_pass := (others => true);
  880. begin
  881.   -----------------------------------------------------------------------------
  882.   -- Test the DA command for data widths from 1 up to MAX_DWIDTH             --
  883.   -----------------------------------------------------------------------------
  884.   gen_da: for i in 1 to MAX_DWIDTH generate
  885.     -- Values which do not change during DA test
  886.     rom_data_DA(i) <= conv_std_logic_vector(0,MAX_DWIDTH);
  887.     ram_data_DA(i) <= conv_std_logic_vector(0,MAX_DWIDTH);
  888.     hlp_DA(i)      <= conv_std_logic_vector(0,MAX_DWIDTH);
  889.     cmd_DA(i)      <= conv_std_logic_vector(32,6);
  890.     ov_DA(i)       <= '0';
  891.     -- Instantiate the ALU unit with the data width set to i
  892.     i_mc8051_alu_DA : mc8051_alu    
  893.       generic map (                 
  894.         DWIDTH => i)                
  895.       port map (                    
  896.         rom_data_i => rom_data_DA(i)(i-1 downto 0), 
  897.         ram_data_i => ram_data_DA(i)(i-1 downto 0), 
  898.         acc_i      => acc_DA(i)(i-1 downto 0),      
  899. --        hlp_i      => hlp_DA(i)(i-1 downto 0),      
  900.         cmd_i      => cmd_DA(i),      
  901.         cy_i       => cy_DA(i)((i-1)/4 downto 0),       
  902.         ov_i       => ov_DA(i),       
  903.         new_cy_o   => new_cy_DA(i)((i-1)/4 downto 0),   
  904.         new_ov_o   => new_ov_DA(i),   
  905.         result_a_o => result_a_DA(i)(i-1 downto 0), 
  906.         result_b_o => result_b_DA(i)(i-1 downto 0));
  907.     -- Call the test procedure for the DA command
  908.     PROC_DA (DWIDTH     => i,
  909.              PROP_DELAY => PROP_DELAY,
  910.              s_datao    => acc_DA(i)(i-1 downto 0),
  911.              s_cy       => cy_DA(i)((i-1)/4 downto 0),
  912.              s_datai    => result_a_DA(i)(i-1 downto 0),
  913.              s_cyi      => new_cy_DA(i)((i-1)/4 downto 0),
  914.              s_da_end   => end_DA(i));
  915.   end generate GEN_DA;
  916.   -----------------------------------------------------------------------------
  917.   
  918.   -----------------------------------------------------------------------------
  919.   -- Test the DIV_ACC_RAM command for data widths from 1 up to MAX_DWIDTH    --
  920.   -----------------------------------------------------------------------------
  921.   gen_div_acc_ram: for i in 1 to MAX_DWIDTH generate
  922.     -- Values which do not change during DIV_ACC_RAM test
  923.     rom_data_DIV_ACC_RAM(i) <= conv_std_logic_vector(0,MAX_DWIDTH);
  924.     hlp_DIV_ACC_RAM(i)      <= conv_std_logic_vector(0,MAX_DWIDTH);
  925.     cmd_DIV_ACC_RAM(i)      <= conv_std_logic_vector(43,6);
  926.     -- Instantiate the ALU unit with the data width set to i
  927.     i_mc8051_alu_DIV_ACC_RAM : mc8051_alu    
  928.       generic map (                 
  929.         DWIDTH => i)                
  930.       port map (                    
  931.         rom_data_i => rom_data_DIV_ACC_RAM(i)(i-1 downto 0), 
  932.         ram_data_i => ram_data_DIV_ACC_RAM(i)(i-1 downto 0), 
  933.         acc_i      => acc_DIV_ACC_RAM(i)(i-1 downto 0),      
  934. --        hlp_i      => hlp_DIV_ACC_RAM(i)(i-1 downto 0),      
  935.         cmd_i      => cmd_DIV_ACC_RAM(i),      
  936.         cy_i       => cy_DIV_ACC_RAM(i)((i-1)/4 downto 0),       
  937.         ov_i       => ov_DIV_ACC_RAM(i),       
  938.         new_cy_o   => new_cy_DIV_ACC_RAM(i)((i-1)/4 downto 0),   
  939.         new_ov_o   => new_ov_DIV_ACC_RAM(i),   
  940.         result_a_o => result_a_DIV_ACC_RAM(i)(i-1 downto 0), 
  941.         result_b_o => result_b_DIV_ACC_RAM(i)(i-1 downto 0));
  942.     PROC_DIV_ACC_RAM (DWIDTH => i,
  943.              PROP_DELAY      => PROP_DELAY,
  944.              s_cyi           => new_cy_DIV_ACC_RAM(i)((i-1)/4 downto 0),
  945.              s_ovi           => new_ov_DIV_ACC_RAM(i),
  946.              s_qutnt         => result_a_DIV_ACC_RAM(i)(i-1 downto 0),
  947.              s_rmndr         => result_b_DIV_ACC_RAM(i)(i-1 downto 0),
  948.              s_cyo           => cy_DIV_ACC_RAM(i)((i-1)/4 downto 0),
  949.              s_ovo           => ov_DIV_ACC_RAM(i),
  950.              s_dvdnd         => acc_DIV_ACC_RAM(i)(i-1 downto 0),
  951.              s_dvsor         => ram_data_DIV_ACC_RAM(i)(i-1 downto 0),
  952.              s_dvdr_end      => end_DIV_ACC_RAM(i));
  953.   end generate gen_div_acc_ram;
  954.   -----------------------------------------------------------------------------
  955.   -----------------------------------------------------------------------------
  956.   -- Test the MUL_ACC_RAM command for data widths from 1 up to MAX_DWIDTH  --
  957.   -----------------------------------------------------------------------------
  958.   gen_mul_acc_ram            : for i in 1 to MAX_DWIDTH generate
  959.     -- Values which do not change during MUL_ACC_RAM test
  960.     product_MUL_ACC_RAM(i)(i-1 downto 0)   <=
  961.       result_a_MUL_ACC_RAM(i)(i-1 downto 0);
  962.     product_MUL_ACC_RAM(i)(i*2-1 downto i) <=
  963.       result_b_MUL_ACC_RAM(i)(i-1 downto 0);
  964.     rom_data_MUL_ACC_RAM(i)            <= conv_std_logic_vector(0, MAX_DWIDTH);
  965.     hlp_MUL_ACC_RAM(i)                 <= conv_std_logic_vector(0, MAX_DWIDTH);
  966.     cmd_MUL_ACC_RAM(i)                 <= conv_std_logic_vector(42, 6);
  967.     -- Instantiate the ALU unit with the data width set to i
  968.     i_mc8051_alu_MUL_ACC_RAM : mc8051_alu
  969.       generic map (
  970.         DWIDTH               => i)
  971.       port map (
  972.         rom_data_i           => rom_data_MUL_ACC_RAM(i)(i-1 downto 0),
  973.         ram_data_i           => ram_data_MUL_ACC_RAM(i)(i-1 downto 0),
  974.         acc_i                => acc_MUL_ACC_RAM(i)(i-1 downto 0),
  975. --        hlp_i                => hlp_MUL_ACC_RAM(i)(i-1 downto 0),
  976.         cmd_i                => cmd_MUL_ACC_RAM(i),
  977.         cy_i                 => cy_MUL_ACC_RAM(i)((i-1)/4 downto 0),
  978.         ov_i                 => ov_MUL_ACC_RAM(i),
  979.         new_cy_o             => new_cy_MUL_ACC_RAM(i)((i-1)/4 downto 0),
  980.         new_ov_o             => new_ov_MUL_ACC_RAM(i),
  981.         result_a_o           => result_a_MUL_ACC_RAM(i)(i-1 downto 0),
  982.         result_b_o           => result_b_MUL_ACC_RAM(i)(i-1 downto 0));
  983.     PROC_MUL_ACC_RAM (DWIDTH => i,
  984.              PROP_DELAY      => PROP_DELAY,
  985.              s_cyi           => new_cy_MUL_ACC_RAM(i)((i-1)/4 downto 0),
  986.              s_ovi           => new_ov_MUL_ACC_RAM(i),
  987.              s_product       => product_MUL_ACC_RAM(i)(i*2-1 downto 0),
  988.              s_cyo           => cy_MUL_ACC_RAM(i)((i-1)/4 downto 0),
  989.              s_ovo           => ov_MUL_ACC_RAM(i),
  990.              s_mltplcnd      => acc_MUL_ACC_RAM(i)(i-1 downto 0),
  991.              s_mltplctr      => ram_data_MUL_ACC_RAM(i)(i-1 downto 0),
  992.              s_mul_end       => end_MUL_ACC_RAM(i));
  993.   end generate gen_mul_acc_ram;
  994.   -----------------------------------------------------------------------------
  995.   -----------------------------------------------------------------------------
  996.   -- Test the AND_ACC_RAM command for data widths from 1 up to MAX_DWIDTH    --
  997.   -----------------------------------------------------------------------------
  998.   gen_and_acc_ram: for i in 1 to MAX_DWIDTH generate
  999.     -- Values which do not change during AND_ACC_RAM test
  1000.     rom_data_AND_ACC_RAM(i) <= conv_std_logic_vector(0,MAX_DWIDTH);
  1001.     hlp_AND_ACC_RAM(i)      <= conv_std_logic_vector(0,MAX_DWIDTH);
  1002.     cmd_AND_ACC_RAM(i)      <= conv_std_logic_vector(37,6);
  1003.     -- Instantiate the ALU unit with the data width set to i
  1004.     i_mc8051_alu_AND_ACC_RAM : mc8051_alu    
  1005.       generic map (                 
  1006.         DWIDTH => i)                
  1007.       port map (                    
  1008.         rom_data_i => rom_data_AND_ACC_RAM(i)(i-1 downto 0), 
  1009.         ram_data_i => ram_data_AND_ACC_RAM(i)(i-1 downto 0), 
  1010.         acc_i      => acc_AND_ACC_RAM(i)(i-1 downto 0),      
  1011. --        hlp_i      => hlp_AND_ACC_RAM(i)(i-1 downto 0),      
  1012.         cmd_i      => cmd_AND_ACC_RAM(i),      
  1013.         cy_i       => cy_AND_ACC_RAM(i)((i-1)/4 downto 0),       
  1014.         ov_i       => ov_AND_ACC_RAM(i),       
  1015.         new_cy_o   => new_cy_AND_ACC_RAM(i)((i-1)/4 downto 0),   
  1016.         new_ov_o   => new_ov_AND_ACC_RAM(i),   
  1017.         result_a_o => result_a_AND_ACC_RAM(i)(i-1 downto 0), 
  1018.         result_b_o => result_b_AND_ACC_RAM(i)(i-1 downto 0));
  1019.     -- Call the test procedure for the AND_ACC_RAM command
  1020.     PROC_AND (DWIDTH    => i,
  1021.              PROP_DELAY => PROP_DELAY,
  1022.              s_cyi      => new_cy_AND_ACC_RAM(i)((i-1)/4 downto 0),
  1023.              s_ovi      => new_ov_AND_ACC_RAM(i),
  1024.              s_result   => result_a_AND_ACC_RAM(i)(i-1 downto 0),
  1025.              s_cyo      => cy_AND_ACC_RAM(i)((i-1)/4 downto 0),
  1026.              s_ovo      => ov_AND_ACC_RAM(i),
  1027.              s_operanda => acc_AND_ACC_RAM(i)(i-1 downto 0),
  1028.              s_operandb => ram_data_AND_ACC_RAM(i)(i-1 downto 0),
  1029.              s_and_end  => end_AND_ACC_RAM(i));
  1030.   end generate gen_and_acc_ram;
  1031.   -----------------------------------------------------------------------------
  1032.   
  1033.   -----------------------------------------------------------------------------
  1034.   -- Test the OR_ACC_RAM command for data widths from 1 up to MAX_DWIDTH    --
  1035.   -----------------------------------------------------------------------------
  1036.   gen_or_acc_ram: for i in 1 to MAX_DWIDTH generate
  1037.     -- Values which do not change during OR_ACC_RAM test
  1038.     rom_data_OR_ACC_RAM(i) <= conv_std_logic_vector(0,MAX_DWIDTH);
  1039.     hlp_OR_ACC_RAM(i)      <= conv_std_logic_vector(0,MAX_DWIDTH);
  1040.     cmd_OR_ACC_RAM(i)      <= conv_std_logic_vector(44,6);
  1041.     -- Instantiate the ALU unit with the data width set to i
  1042.     i_mc8051_alu_OR_ACC_RAM : mc8051_alu    
  1043.       generic map (                 
  1044.         DWIDTH => i)                
  1045.       port map (                    
  1046.         rom_data_i => rom_data_OR_ACC_RAM(i)(i-1 downto 0), 
  1047.         ram_data_i => ram_data_OR_ACC_RAM(i)(i-1 downto 0), 
  1048.         acc_i      => acc_OR_ACC_RAM(i)(i-1 downto 0),      
  1049. --        hlp_i      => hlp_OR_ACC_RAM(i)(i-1 downto 0),      
  1050.         cmd_i      => cmd_OR_ACC_RAM(i),      
  1051.         cy_i       => cy_OR_ACC_RAM(i)((i-1)/4 downto 0),       
  1052.         ov_i       => ov_OR_ACC_RAM(i),       
  1053.         new_cy_o   => new_cy_OR_ACC_RAM(i)((i-1)/4 downto 0),   
  1054.         new_ov_o   => new_ov_OR_ACC_RAM(i),   
  1055.         result_a_o => result_a_OR_ACC_RAM(i)(i-1 downto 0), 
  1056.         result_b_o => result_b_OR_ACC_RAM(i)(i-1 downto 0));
  1057.     -- Call the test procedure for the OR_ACC_RAM command
  1058.     PROC_OR (DWIDTH     => i,
  1059.              PROP_DELAY => PROP_DELAY,
  1060.              s_cyi      => new_cy_OR_ACC_RAM(i)((i-1)/4 downto 0),
  1061.              s_ovi      => new_ov_OR_ACC_RAM(i),
  1062.              s_result   => result_a_OR_ACC_RAM(i)(i-1 downto 0),
  1063.              s_cyo      => cy_OR_ACC_RAM(i)((i-1)/4 downto 0),
  1064.              s_ovo      => ov_OR_ACC_RAM(i),
  1065.              s_operanda => acc_OR_ACC_RAM(i)(i-1 downto 0),
  1066.              s_operandb => ram_data_OR_ACC_RAM(i)(i-1 downto 0),
  1067.              s_or_end  => end_OR_ACC_RAM(i));
  1068.   end generate gen_or_acc_ram;
  1069.   -----------------------------------------------------------------------------
  1070.   
  1071.   -----------------------------------------------------------------------------
  1072.   -- Test the XOR_ACC_RAM command for data widths from 1 up to MAX_DWIDTH    --
  1073.   -----------------------------------------------------------------------------
  1074.   gen_xor_acc_ram: for i in 1 to MAX_DWIDTH generate
  1075.     -- Values which do not change during XOR_ACC_RAM test
  1076.     rom_data_XOR_ACC_RAM(i) <= conv_std_logic_vector(0,MAX_DWIDTH);
  1077.     hlp_XOR_ACC_RAM(i)      <= conv_std_logic_vector(0,MAX_DWIDTH);
  1078.     cmd_XOR_ACC_RAM(i)      <= conv_std_logic_vector(47,6);
  1079.     -- Instantiate the ALU unit with the data width set to i
  1080.     i_mc8051_alu_XOR_ACC_RAM : mc8051_alu    
  1081.       generic map (                 
  1082.         DWIDTH => i)                
  1083.       port map (                    
  1084.         rom_data_i => rom_data_XOR_ACC_RAM(i)(i-1 downto 0), 
  1085.         ram_data_i => ram_data_XOR_ACC_RAM(i)(i-1 downto 0), 
  1086.         acc_i      => acc_XOR_ACC_RAM(i)(i-1 downto 0),      
  1087. --        hlp_i      => hlp_XOR_ACC_RAM(i)(i-1 downto 0),      
  1088.         cmd_i      => cmd_XOR_ACC_RAM(i),      
  1089.         cy_i       => cy_XOR_ACC_RAM(i)((i-1)/4 downto 0),       
  1090.         ov_i       => ov_XOR_ACC_RAM(i),       
  1091.         new_cy_o   => new_cy_XOR_ACC_RAM(i)((i-1)/4 downto 0),   
  1092.         new_ov_o   => new_ov_XOR_ACC_RAM(i),   
  1093.         result_a_o => result_a_XOR_ACC_RAM(i)(i-1 downto 0), 
  1094.         result_b_o => result_b_XOR_ACC_RAM(i)(i-1 downto 0));
  1095.     -- Call the test procedure for the XOR_ACC_RAM command
  1096.     PROC_XOR (DWIDTH    => i,
  1097.              PROP_DELAY => PROP_DELAY,
  1098.              s_cyi      => new_cy_XOR_ACC_RAM(i)((i-1)/4 downto 0),
  1099.              s_ovi      => new_ov_XOR_ACC_RAM(i),
  1100.              s_result   => result_a_XOR_ACC_RAM(i)(i-1 downto 0),
  1101.              s_cyo      => cy_XOR_ACC_RAM(i)((i-1)/4 downto 0),
  1102.              s_ovo      => ov_XOR_ACC_RAM(i),
  1103.              s_operanda => acc_XOR_ACC_RAM(i)(i-1 downto 0),
  1104.              s_operandb => ram_data_XOR_ACC_RAM(i)(i-1 downto 0),
  1105.              s_xor_end  => end_XOR_ACC_RAM(i));
  1106.   end generate gen_xor_acc_ram;
  1107.   -----------------------------------------------------------------------------
  1108.   
  1109.   -----------------------------------------------------------------------------
  1110.   -- Test the ADD_ACC_RAM command for data widths from 1 up to MAX_DWIDTH    --
  1111.   -----------------------------------------------------------------------------
  1112.   gen_add_acc_ram: for i in 1 to MAX_DWIDTH generate
  1113.     -- Values which do not change during ADD_ACC_RAM test
  1114.     rom_data_ADD_ACC_RAM(i)  <= conv_std_logic_vector(0, MAX_DWIDTH);
  1115.     hlp_ADD_ACC_RAM(i)       <= conv_std_logic_vector(0, MAX_DWIDTH);
  1116.     cmd_ADD_ACC_RAM(i)       <= conv_std_logic_vector(33, 6);
  1117.     -- Instantiate the ALU unit with the data width set to i
  1118.     i_mc8051_alu_ADD_ACC_RAM : mc8051_alu    
  1119.       generic map (                 
  1120.         DWIDTH => i)                
  1121.       port map (                    
  1122.         rom_data_i => rom_data_ADD_ACC_RAM(i)(i-1 downto 0), 
  1123.         ram_data_i => ram_data_ADD_ACC_RAM(i)(i-1 downto 0), 
  1124.         acc_i      => acc_ADD_ACC_RAM(i)(i-1 downto 0),      
  1125. --        hlp_i      => hlp_ADD_ACC_RAM(i)(i-1 downto 0),      
  1126.         cmd_i      => cmd_ADD_ACC_RAM(i),      
  1127.         cy_i       => cy_ADD_ACC_RAM(i)((i-1)/4 downto 0),       
  1128.         ov_i       => ov_ADD_ACC_RAM(i),       
  1129.         new_cy_o   => new_cy_ADD_ACC_RAM(i)((i-1)/4 downto 0),   
  1130.         new_ov_o   => new_ov_ADD_ACC_RAM(i),   
  1131.         result_a_o => result_a_ADD_ACC_RAM(i)(i-1 downto 0), 
  1132.         result_b_o => result_b_ADD_ACC_RAM(i)(i-1 downto 0));
  1133.     -- Call the test procedure for the ADD_ACC_RAM command
  1134.     PROC_ADD (DWIDTH    => i,
  1135.              PROP_DELAY => PROP_DELAY,
  1136.              ADD_CARRY  => false, 
  1137.              s_cyi      => new_cy_ADD_ACC_RAM(i)((i-1)/4 downto 0),
  1138.              s_ovi      => new_ov_ADD_ACC_RAM(i),
  1139.              s_result   => result_a_ADD_ACC_RAM(i)(i-1 downto 0),
  1140.              s_cyo      => cy_ADD_ACC_RAM(i)((i-1)/4 downto 0),
  1141.              s_ovo      => ov_ADD_ACC_RAM(i),
  1142.              s_operanda => acc_ADD_ACC_RAM(i)(i-1 downto 0),
  1143.              s_operandb => ram_data_ADD_ACC_RAM(i)(i-1 downto 0),
  1144.              s_add_end  => end_ADD_ACC_RAM(i));
  1145.   end generate gen_add_acc_ram;
  1146.   -----------------------------------------------------------------------------
  1147.   
  1148.   -----------------------------------------------------------------------------
  1149.   -- Test the ADDC_ACC_RAM command for data widths from 1 up to MAX_DWIDTH   --
  1150.   -----------------------------------------------------------------------------
  1151.   gen_addc_acc_ram: for i in 1 to MAX_DWIDTH generate
  1152.     -- Values which do not change during ADDC_ACC_RAM test
  1153.     rom_data_ADDC_ACC_RAM(i)  <= conv_std_logic_vector(0, MAX_DWIDTH);
  1154.     hlp_ADDC_ACC_RAM(i)       <= conv_std_logic_vector(0, MAX_DWIDTH);
  1155.     cmd_ADDC_ACC_RAM(i)       <= conv_std_logic_vector(35, 6);
  1156.     -- Instantiate the ALU unit with the data width set to i
  1157.     i_mc8051_alu_ADDC_ACC_RAM : mc8051_alu    
  1158.       generic map (                 
  1159.         DWIDTH => i)                
  1160.       port map (                    
  1161.         rom_data_i => rom_data_ADDC_ACC_RAM(i)(i-1 downto 0), 
  1162.         ram_data_i => ram_data_ADDC_ACC_RAM(i)(i-1 downto 0), 
  1163.         acc_i      => acc_ADDC_ACC_RAM(i)(i-1 downto 0),      
  1164. --        hlp_i      => hlp_ADDC_ACC_RAM(i)(i-1 downto 0),      
  1165.         cmd_i      => cmd_ADDC_ACC_RAM(i),      
  1166.         cy_i       => cy_ADDC_ACC_RAM(i)((i-1)/4 downto 0),       
  1167.         ov_i       => ov_ADDC_ACC_RAM(i),       
  1168.         new_cy_o   => new_cy_ADDC_ACC_RAM(i)((i-1)/4 downto 0),   
  1169.         new_ov_o   => new_ov_ADDC_ACC_RAM(i),   
  1170.         result_a_o => result_a_ADDC_ACC_RAM(i)(i-1 downto 0), 
  1171.         result_b_o => result_b_ADDC_ACC_RAM(i)(i-1 downto 0));
  1172.     -- Call the test procedure for the ADDC_ACC_RAM command
  1173.     PROC_ADD (DWIDTH    => i,
  1174.              PROP_DELAY => PROP_DELAY,
  1175.              ADD_CARRY  => true, 
  1176.              s_cyi      => new_cy_ADDC_ACC_RAM(i)((i-1)/4 downto 0),
  1177.              s_ovi      => new_ov_ADDC_ACC_RAM(i),
  1178.              s_result   => result_a_ADDC_ACC_RAM(i)(i-1 downto 0),
  1179.              s_cyo      => cy_ADDC_ACC_RAM(i)((i-1)/4 downto 0),
  1180.              s_ovo      => ov_ADDC_ACC_RAM(i),
  1181.              s_operanda => acc_ADDC_ACC_RAM(i)(i-1 downto 0),
  1182.              s_operandb => ram_data_ADDC_ACC_RAM(i)(i-1 downto 0),
  1183.              s_add_end  => end_ADDC_ACC_RAM(i));
  1184.   end generate gen_addc_acc_ram;
  1185.   -----------------------------------------------------------------------------
  1186.     
  1187.   -----------------------------------------------------------------------------
  1188.   -- Test the SUB_ACC_RAM command for data widths from 1 up to MAX_DWIDTH   --
  1189.   -----------------------------------------------------------------------------
  1190.   gen_sub_acc_ram: for i in 1 to MAX_DWIDTH generate
  1191.     -- Values which do not change during SUB_ACC_RAM test
  1192.     rom_data_SUB_ACC_RAM(i)  <= conv_std_logic_vector(0, MAX_DWIDTH);
  1193.     hlp_SUB_ACC_RAM(i)       <= conv_std_logic_vector(0, MAX_DWIDTH);
  1194.     cmd_SUB_ACC_RAM(i)       <= conv_std_logic_vector(40, 6);
  1195.     -- Instantiate the ALU unit with the data width set to i
  1196.     i_mc8051_alu_SUB_ACC_RAM : mc8051_alu    
  1197.       generic map (                 
  1198.         DWIDTH => i)                
  1199.       port map (                    
  1200.         rom_data_i => rom_data_SUB_ACC_RAM(i)(i-1 downto 0), 
  1201.         ram_data_i => ram_data_SUB_ACC_RAM(i)(i-1 downto 0), 
  1202.         acc_i      => acc_SUB_ACC_RAM(i)(i-1 downto 0),      
  1203. --        hlp_i      => hlp_SUB_ACC_RAM(i)(i-1 downto 0),      
  1204.         cmd_i      => cmd_SUB_ACC_RAM(i),      
  1205.         cy_i       => cy_SUB_ACC_RAM(i)((i-1)/4 downto 0),       
  1206.         ov_i       => ov_SUB_ACC_RAM(i),       
  1207.         new_cy_o   => new_cy_SUB_ACC_RAM(i)((i-1)/4 downto 0),   
  1208.         new_ov_o   => new_ov_SUB_ACC_RAM(i),   
  1209.         result_a_o => result_a_SUB_ACC_RAM(i)(i-1 downto 0), 
  1210.         result_b_o => result_b_SUB_ACC_RAM(i)(i-1 downto 0));
  1211.     -- Call the test procedure for the SUB_ACC_RAM command
  1212.     PROC_SUB (DWIDTH    => i,
  1213.              PROP_DELAY => PROP_DELAY,
  1214.              s_cyi      => new_cy_SUB_ACC_RAM(i)((i-1)/4 downto 0),
  1215.              s_ovi      => new_ov_SUB_ACC_RAM(i),
  1216.              s_result   => result_a_SUB_ACC_RAM(i)(i-1 downto 0),
  1217.              s_cyo      => cy_SUB_ACC_RAM(i)((i-1)/4 downto 0),
  1218.              s_ovo      => ov_SUB_ACC_RAM(i),
  1219.              s_operanda => acc_SUB_ACC_RAM(i)(i-1 downto 0),
  1220.              s_operandb => ram_data_SUB_ACC_RAM(i)(i-1 downto 0),
  1221.              s_sub_end  => end_SUB_ACC_RAM(i));
  1222.   end generate gen_sub_acc_ram;
  1223.   -----------------------------------------------------------------------------
  1224.     
  1225.   gen_pass: for i in 1 to MAX_DWIDTH generate
  1226.     pass(i+1) <= end_DA(i)
  1227.                  and pass(i)
  1228.                  and end_DIV_ACC_RAM(i)
  1229.                  and end_AND_ACC_RAM(i)
  1230.                  and end_OR_ACC_RAM(i)
  1231.                  and end_XOR_ACC_RAM(i)
  1232.                  and end_ADD_ACC_RAM(i)
  1233.                  and end_ADDC_ACC_RAM(i)
  1234.                  and end_SUB_ACC_RAM(i)
  1235.                  and end_MUL_ACC_RAM(i);
  1236.   end generate gen_pass;
  1237.   -- The following process guarantees that the simulation is not stopped
  1238.   -- (despite the ocurrence of an error situation) till all the instantiated
  1239.   -- designs under test have finished their whole test.
  1240.   p_endsim: process
  1241.   begin  -- process p_endsim
  1242.     wait until pass(MAX_DWIDTH+1) = true;
  1243.     assert false report "SIMULATION ENDED SUCCESSFULLY !!!" severity failure;
  1244.   end process p_endsim;
  1245.   
  1246. end sim;