pci_tar.tb

来自「VHDLVERILOG语言实现的CARDBUS的IP源码,已经实现现场应用」· TB 代码 · 共 854 行 · 第 1/3 页

TB
854
字号
  pci_ad(31 downto 24) <=   ( jptempvar35 ) after OUTPUT_DELAY WHEN  ( adoe )  = '1'  ELSE "ZZZZZZZZ" after OUTPUT_DELAY;
  pci_ad(23 downto 16) <=   ( jptempvar36 ) after OUTPUT_DELAY WHEN  ( adoe )  = '1'  ELSE "ZZZZZZZZ" after OUTPUT_DELAY;
  pci_ad(15 downto  8) <=   ( jptempvar37 ) after OUTPUT_DELAY WHEN  ( adoe )  = '1'  ELSE "ZZZZZZZZ" after OUTPUT_DELAY;
  pci_ad( 7 downto  0) <=   ( jptempvar38 ) after OUTPUT_DELAY WHEN  ( adoe )  = '1'  ELSE "ZZZZZZZZ" after OUTPUT_DELAY;
  adoe <= jptempvar39;
  old_devsel <=  '1' WHEN  (  ( adoe OR  write_trdy_en )  )  = '1'  ELSE  '0';
  devsel_n <= new_devsel after OUTPUT_DELAY;
  write_trdy_en <= jptempvar40;
  target_selected <= jptempvar41;
 

set_devsel: PROCESS
BEGIN
 wait on clk until clk = '1'; --- to do always @(posedge clk)
   IF ((match OR match64) = '1') THEN
      
----FOR devsel_delay=0;  devsel_delay < DEVICE_SPEED; devsel_delay = devsel_delay + 1
      FOR devsel_delay IN 0 to DEVICE_SPEED-1 LOOP
          wait until rising_edge(clk);
      END LOOP;
      IF  ( TARGET_ABORT )  = '1'  THEN
          devsel_ok <=  '1';
          devsel_activate <=  '1';
          IF  ( jptempvar42 )  = '1'  THEN
              wait until rising_edge(clk);
          END IF;
        wait until rising_edge(clk);
        wait until rising_edge(clk);
          devsel_activate <=  '0';
          devsel_ok <=  '0';
          Assert_Target_Abort <=  '1';
        wait until rising_edge(clk);
          WHILE frame = '1' LOOP
            wait until rising_edge(clk);
          END LOOP;
          Assert_Target_Abort <=  '0';
      ELSE
          devsel_ok <=  '1';
          devsel_activate <=  '1';
          IF  ( jptempvar43 )  = '1'  THEN
            wait until rising_edge(clk);
          END IF;
        wait until rising_edge(clk);
          devsel_activate <=  '0';
        wait until rising_edge(clk);
          WHILE old_devsel = '1' LOOP
            wait until rising_edge(clk);
          END LOOP;
          devsel_ok <=  '0';
      END IF;
   END IF;

END PROCESS;

new_devsel <=  '0' WHEN  (  (  (  ( old_devsel OR  devsel_activate )  )  AND  (  devsel_ok AND  target_selected )  )  )  = '1'  ELSE  'Z';
  trdy_n <=   (  NOT trdy_reg ) after OUTPUT_DELAY WHEN  ( trdyoe )  = '1'  ELSE  'Z' after OUTPUT_DELAY;
  trdy_reg <=  trdylatch WHEN  ( stoplatch )  = '1'  ELSE   (  (  ( adoe OR  write_trdy_en )  )  AND  (  (  (  NOT  ( jptempvar44 )  )  )  AND  (   (  (  ( jptempvar45 )  OR  (  NOT WAITSTATES_ENABLE )  )  )  AND  (   ( devsel_ok )  AND   (  NOT TARGET_ABORT )  )  )  )  ) ;
  trdyoe <= adoe OR  write_trdy_en;
 

--ALWAYS: posedge clk or posedge rst) begin if (rst) begin       trdylatch <= 1'b0
trdy_stop_latch: PROCESS ( clk, rst)
BEGIN
 IF  ( rst )  = '1'  THEN
       trdylatch <=  '0';
        stoplatch <=  '0';
 --ADDED IF BELOW
 ELSIF rising_edge(clk) THEN
IF  (  (  (  NOT stop_n )  )  AND  (   (  NOT trdy_n )  AND   (  NOT irdy_n )  )  )  = '1'  THEN
         trdylatch <=  '0';
          stoplatch <=  '1';
  ELSE stoplatch <=  stop;
          trdylatch <=  trdy_reg;
  END IF;
 END IF;
 END PROCESS;



--ALWAYS: posedge clk or posedge rst) begin if (rst) begin       WaitStates <= 0
waits: PROCESS ( clk, rst)
BEGIN
 IF  ( rst )  = '1'  THEN
       WaitStates <=  0;
        StopWaits <=  0;
 --ADDED IF BELOW
 ELSIF rising_edge(clk) THEN
  IF  (  ( match64 AND   ( jptempvar46 )  )  OR   ( match AND   ( jptempvar47 )  )  )  = '1'  THEN
         WaitStates <=  jptempvar48;
          StopWaits <=  STOP_WAITS;
  ELSIF  (  (  ( jptempvar49 )  )  AND  (  (  NOT  ( jptempvar50 )  )  AND  irdy )  )  = '1'  THEN
         WaitStates <=  jptempvar51;
          StopWaits <=  STOP_WAITS;
  ELSIF  (  NOT  ( jptempvar52 )  )  = '1'  THEN
         WaitStates <=  jptempvar53;
          StopWaits <=  jptempvar55;
  ELSE
	WaitStates <=  0;
	StopWaits <=  0;
  END IF;
  END IF;
 END PROCESS;

set_MyMemory: PROCESS (clk, rst)
	VARIABLE temp_vec : std_logic_vector(31 downto 0);
	VARIABLE init : integer;
BEGIN
 IF falling_edge(rst) THEN
    FOR init IN 0 to MEM_SIZE-1 LOOP
		temp_vec := std_logic_vector(to_unsigned(init,32));
		MyMemory(init) <=  temp_vec(7 downto 0);
    END LOOP;
 ELSIF rising_edge(clk) THEN
    IF  (  ( irdy )  AND  (  trdy_reg AND  write_trdy_en )  )  = '1'  THEN
       IF  (  NOT c_be_n(0) )  = '1'  THEN
          MyMemory(curr_addr) <=  pci_ad(7 downto 0);
       END IF;
       IF  (  NOT c_be_n(1) )  = '1'  THEN
          MyMemory(curr_addr+1) <=  pci_ad(15 downto 8);
       END IF;
       IF  (  NOT c_be_n(2) )  = '1'  THEN
          MyMemory(curr_addr+2) <=  pci_ad(23 downto 16);
       END IF;
       IF  (  NOT c_be_n(3) )  = '1'  THEN
          MyMemory(curr_addr+3) <=  pci_ad(31 downto 24);
       END IF;
       IF  (  ( jptempvar57 )  AND  ack64 )  = '1'  THEN
          IF  (  NOT c_be_n(4) )  = '1'  THEN
             MyMemory(curr_addr+4) <=  pci_ad(39 downto 32);
          END IF;
          IF  (  NOT c_be_n(5) )  = '1'  THEN
             MyMemory(curr_addr+5) <=  pci_ad(47 downto 40);
          END IF;
          IF  (  NOT c_be_n(6) )  = '1'  THEN
             MyMemory(curr_addr+6) <=  pci_ad(55 downto 48);
          END IF;
          IF  (  NOT c_be_n(7) )  = '1'  THEN
             MyMemory(curr_addr+7) <=  pci_ad(63 downto 56);
          END IF;
       END IF;
    END IF;
 END IF;
END PROCESS;



--ALWAYS: posedge clk or posedge rst) begin if (rst)     data_count <= 0
set_data_count: PROCESS ( clk, rst)
BEGIN
 IF  ( rst )  = '1'  THEN
     data_count <=  0;
 --ADDED IF BELOW
 ELSIF rising_edge(clk) THEN
  IF  ( irdy AND  trdy_reg )  = '1'  THEN
       data_count <=  data_count +  1;
  ELSIF  ( jptempvar58 )  = '1'  THEN
       data_count <=  0;
  END IF;
  END IF;
 END PROCESS;

stop_n <=   NOT stop_reg after OUTPUT_DELAY WHEN  ( stop_en )  = '1'  ELSE  'Z' after OUTPUT_DELAY;
  stop_en <=  ( adoe OR  write_trdy_en )  OR  Assert_Target_Abort;
 

--ALWAYS: posedge clk or posedge rst) begin if(rst) begin         stophold <= 1'b0
set_stophold: PROCESS ( clk, rst)
BEGIN
 IF  ( rst )  = '1'  THEN
         stophold <=  '0';
 --ADDED IF BELOW
 ELSIF rising_edge(clk) THEN
stophold <=  stop_reg;
  END IF;
 END PROCESS;

stop_reg <= ( (stop_enable_used AND jptempvar59 AND jptempvar60 AND stop_en AND devsel) OR
              (stop_enable_used AND trdy_reg AND jptempvar61 AND jptempvar62) OR
              (stophold AND devsel) OR
              Assert_Target_Abort);
 

--ALWAYS: posedge clk or posedge rst) begin if(rst) begin       count_stop <= 1
retry_stop_count: PROCESS ( clk, rst)
BEGIN
 IF  ( rst )  = '1'  THEN
       count_stop <=  '1';
	   retry_count_counter <= RETRY_COUNT;
	   stop_enable_used <= STOP_ENABLE;
 --ADDED IF BELOW
 ELSIF rising_edge(clk) THEN
IF  ( stop_reg AND  count_stop )  = '1'  THEN
 IF  ( jptempvar63 )  = '1'  THEN
               count_stop <= '0';
  ELSE retry_count_counter <=  retry_count_counter -  1;
                  count_stop <=  '0';
  END IF;
 ELSIF  (  NOT stop_reg )  = '1'  THEN
             count_stop <=  '1';
 IF  (  ( jptempvar64 )  AND   ( ENABLE_RETRY_COUNT )  )  = '1'  THEN
                 stop_enable_used <=  '0';
  END IF;
 END IF;
 END IF;
 END PROCESS;


--MODULE (COMPONENT) INSTANCIATION
my_pci_parity_check: pci_parity_check
      port map (
        ad_p=>pci_ad_d(63 downto 0) , 
        c_be_n_p=>c_be_n_d(7 downto 0) , 
        parity32=>parity32_out , 
        parity64=>parity64_out ) ;
 

--ALWAYS: posedge clk or posedge rst) begin if(rst) begin         c_be_n_d[7JPDOWNTO0] <= 8'h0
set_parity: PROCESS ( clk, rst)
BEGIN
 IF  ( rst )  = '1'  THEN
         c_be_n_d(7 downto 0) <=  "00000000";
          pci_ad_d(63 downto 0) <=  "0000000000000000000000000000000000000000000000000000000000000000";
          parity_en <=  '0';
          parity64_en <= '0';
   parity32_out_d <=  '0';
   parity64_out_d <=  '0';
 --ADDED IF BELOW
 ELSIF rising_edge(clk) THEN
c_be_n_d(7 downto 0) <=  c_be_n(7 downto 0);
          pci_ad_d(63 downto 0) <=  pci_ad(63 downto 0);
   parity_en <=  adoe;
   parity64_en <= adoe AND (NOT ack64_n);
   parity32_out_d <=  parity32_out;
   parity64_out_d <=  parity64_out;
  END IF;
 END PROCESS;

par <=  parity32_out XOR  WRONG_PAR after OUTPUT_DELAY WHEN  ( parity_en )  = '1'  ELSE  'Z' after OUTPUT_DELAY;
  par64 <=  parity64_out XOR  WRONG_PAR64 after OUTPUT_DELAY WHEN  ( parity64_en )  = '1'  ELSE  'Z' after OUTPUT_DELAY;

report_parity: PROCESS (clk)
BEGIN
   IF rising_edge(clk) THEN
      IF (parity_en = '1') THEN
         ASSERT (NOT (parity32_out = 'X'))
            REPORT "ERROR: parity output from ext. target is X"
            SEVERITY ERROR;
      END IF;
      IF (parity64_en = '1') THEN
         ASSERT (NOT (parity64_out = 'X'))
            REPORT "ERROR: parity 64 output from ext. target is X"
            SEVERITY ERROR;
      END IF;
   END IF;
END PROCESS;
 

--ALWAYS: posedge clk or posedge rst) begin if (rst) begin          perr_out <= 1'b0
set_perr: PROCESS
BEGIN

 wait on rst, clk until (rst = '1' OR clk = '1');
 IF  ( rst )  = '1'  THEN
          perr_out <=  '0';
          perr_en <=  '0';
 --ADDED IF BELOW
 ELSIF rising_edge(clk) THEN
   IF  (  ( irdy )  AND  (  trdy_reg AND  write_trdy_en )  )  = '1'  THEN
      wait until rising_edge(clk);
              perr_en <=  '1';
              perr_out <=  '1';
      wait until rising_edge(clk);
              perr_en <=  '0';
              perr_out <=  '0';
  END IF;
 END IF;

END PROCESS;

perr_n <= (NOT perr_out) after OUTPUT_DELAY WHEN (perr_en AND PERR_ASSERT) = '1' ELSE 'Z' after OUTPUT_DELAY;

END pci_tar_ARC_CORE;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?