2016-12-03 10 views
0

VHDL로 코드를 작성하고 Test HD를 사용하여 코드를 컴파일하고 시뮬레이션하기 위해 Active HDL Student 에디션을 사용하고 있습니다. 500ns 동안 시뮬레이션 할 때 신호는 변하지 만 파형의 신호는 표시되지 않고 U에 고정되어 있습니다. 이 문제의 원인을 찾을 수 없습니다. 어떤 도움을 크게 감상 할 수VHDL 시뮬레이션에서 파형을 표시하지 않습니다.

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
use ieee.std_logic_arith.all; 

entity idexreg_tb is 
end idexreg_tb; 

architecture test of idexreg_tb is 
--input signals 
signal rst_bar : std_logic; 
signal clk: std_logic; 
signal immediate_in : std_logic_vector(63 downto 0); 
signal reg0_in : std_logic_vector(63 downto 0); 
signal reg1_in : std_logic_vector(63 downto 0); 
signal instruction_in : std_logic_vector(3 downto 0); 
signal pc_in : std_logic_vector(3 downto 0); 

--output signals 
signal immediate_out : std_logic_vector(63 downto 0); 
signal reg0_out : std_logic_vector(63 downto 0); 
signal reg1_out : std_logic_vector(63 downto 0); 
signal instruction_out : std_logic_vector(3 downto 0); 
signal pc_out : std_logic_vector(3 downto 0); 

-- boolean to signify end of simulation 
signal end_sim : boolean := false; 

constant period : time := 50ns; 

begin 

UUT: entity idexreg 
    port map(
    rst_bar => rst_bar, 
    clk => clk, 
    immediate_in => immediate_in, 
    reg0_in => reg0_in, 
    reg1_in => reg1_in, 
    instruction_in => instruction_in, 
    pc_in => pc_in, 
    immediate_out => immediate_out, 
    reg0_out => reg0_out, 
    reg1_out => reg1_out, 
    instruction_out => instruction_out, 
    pc_out => pc_out); 


-- Generate the Clock signal 
clk_gen: process 
begin 
clk <= '0'; 
loop 
    wait for period/2; 
    clk <= not clk; 
    exit when end_sim = true; 
end loop; 
wait; 
end process; 

stim: process 
begin 
    -- reset the register file first 
    rst_bar <= '0'; 
    wait for 100ns; 
    rst_bar <= '1'; 


    --Test 1 
    immediate_in <= std_logic_vector(x"AAAAAAAAAAAAAAAA"); 
    reg0_in <= std_logic_vector(x"AAAAAAAAAAAAAAAA"); 
    reg1_in <= std_logic_vector(x"AAAAAAAAAAAAAAAA"); 
    instruction_in <= std_logic_vector(x"A"); 
    pc_in <= std_logic_vector(x"1"); 
    wait for 10ns; 
    --Test 2 
    immediate_in <= std_logic_vector(x"BBBBBBBBBBBBBBBB"); 
    reg0_in <= std_logic_vector(x"BBBBBBBBBBBBBBBB"); 
    reg1_in <= std_logic_vector(x"BBBBBBBBBBBBBBBB"); 
    instruction_in <= std_logic_vector(x"B"); 
    pc_in <= std_logic_vector(x"2"); 
    wait for 30ns; 
    --Test 3 
    immediate_in <= std_logic_vector(x"CCCCCCCCCCCCCCCC"); 
    reg0_in <= std_logic_vector(x"CCCCCCCCCCCCCCCC"); 
    reg1_in <= std_logic_vector(x"CCCCCCCCCCCCCCCC"); 
    instruction_in <= std_logic_vector(x"C"); 
    pc_in <= std_logic_vector(x"3"); 
    end_sim <= true; 

    wait; 
end process; 

end test; 

:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity idexreg is 
    port(
    rst_bar : in std_logic; 
    clk : in std_logic; 
    immediate_in : in std_logic_vector(63 downto 0); 
    reg0_in : in std_logic_vector(63 downto 0); 
    reg1_in : in std_logic_vector(63 downto 0); 
    instruction_in : in std_logic_vector(3 downto 0); 
    pc_in : in std_logic_vector(3 downto 0); 
    immediate_out : out std_logic_vector(63 downto 0); 
    reg0_out : out std_logic_vector(63 downto 0); 
    reg1_out : out std_logic_vector(63 downto 0); 
    instruction_out : out std_logic_vector(3 downto 0); 
    pc_out : out std_logic_vector(3 downto 0) 
    ); 
end idexreg;  

architecture idexreg_arch of idexreg is 
begin 
    arch: process(clk, rst_bar) 
    begin 
     if rst_bar = '0' then 
      immediate_out <= std_logic_vector(x"0000000000000000"); 
      reg0_out <= std_logic_vector(x"0000000000000000"); 
      reg1_out <= std_logic_vector(x"0000000000000000"); 
      instruction_out <= std_logic_vector(x"0"); 
      pc_out <= std_logic_vector(x"0");  
     elsif falling_edge(clk) then 
      immediate_out <= immediate_in; 
      reg0_out <= reg0_in; 
      reg1_out <= reg1_in; 
      instruction_out <= instruction_in; 
      pc_out <= pc_in; 
     end if; 
    end process; 
end idexreg_arch; 

이 테스트 벤치 코드입니다 :

이 엔티티 내 코드입니다!

답변

0

두 개의 다른 표준 준수 시뮬레이터를 사용하면 세 가지 종류의 오류가 발견되었습니다.

시맨틱 오류 :

UUT: entity idexreg 

이 사용 절 use.work.all; idexreg 언 바운드 (표시되지 않습니다 이전에 분석 엔티티 선언하지 않고

UUT: entity work.idexreg 

을해야한다, 이것은 '을 설명 할 우리). 선택한 이름은 이름이 직접 보이지 않을 때 사용할 수 있습니다.

IEEE 표준 1076년부터 2008년까지 12.3 가시성

를 텍스트 내의 소정 장소 식별자의 발생 의미하여, 과부하 선언하는 경우에, 또한 시인성이 규칙에 의해 정의되고 규칙 오버로딩. 이 절에서 고려 된 식별자는 예약어 이외의 식별자 또는 사전 정의 된 속성을 나타내는 속성 지정자를 포함한다. 이 절에서 고려되는 장소는 어휘 적 요소 (예 : 식별자)가 나타나는 장소이다. 이 하위 절에서 고려 된 오버로드 된 선언은 서브 프로그램 및 열거 형 리터럴에 대한 선언입니다.

12.4을 사용하여 절

유스 절은 선택하여 볼 수 있습니다 선언의 직접적인 가시성을 달성한다.

컨텍스트 선언 패키지 STANDARD 제외

13.2 설계 라이브러리

모든 설계 부 (수정 위에서 도시)는 그 컨텍스트 절의 일부로 다음 내재 컨텍스트 항목을 포함하는 것으로한다 :

library STD, WORK; use STD.STANDARD.all;

라이브러리 이름 WORK는 라이브러리 절에서 직접 볼 수 있지만 라이브러리 작업으로 분석 된 디자인 단위는 use 절없이 직접 볼 수 없습니다.

12로 돌아 가기.4 Use 절 :

use 절의 각 선택된 이름은 잠재적으로 직접적으로 볼 수있는 하나 이상의 선언을 식별합니다. 선택한 이름의 접미사가 유형 표시 이외의 단순한 이름이거나 문자 리터럴 또는 연산자 기호 인 경우 선택한 이름은 포함 된 간단한 이름, 문자 리터럴 또는 연산자 기호의 선언 만 식별합니다. 선택한 이름의 접두어로 표시된 패키지 또는 라이브러리.
...
접미어가 모두 예약어 인 경우 선택한 이름은 선택한 이름의 접두어로 표시된 패키지 또는 라이브러리 내에 포함 된 모든 선언을 식별합니다.


는 먼저 시뮬레이터는 설계 설명에 의해 준수를 필요로하지 않으며, 또한 두 개의 추가 오류 클래스가 있습니다.

제, 문법 규칙 :

15.3 어휘 요소, 세퍼레이터 및

적어도 하나의 세퍼레이터 식별자 또는 추상적 리터럴 및 인접한 식별자 또는 추상 사이 필요한 구분 기호 정확한.

이 규칙을 무시한 성공적인 상용 시뮬레이터가 하나 이상 있습니다. -2008 년 동안 그것을 무시하는 것이 더 어렵습니다.

두 번째, 또 다른 의미 규칙 :

9.3.6 유형 변환

-와 유형이 같은 차원이있는 경우에만 경우 배열 유형 밀접하게 관련되어 배열 - 두 개의 유형과 요소 유형이 밀접하게 관련되어 있습니다.

문자열 및 std_logic_vector는 유형 변환과 밀접한 관련이 없습니다. 당신은 불필요한 형식 변환을 삭제할 수 있습니다 - 비트 문자열의 형태는 문맥에서입니다 :

9.3.6 :

형식 변환의 피연산자의 유형은 피연산자에 12.5의 규칙을 적용하여 결정한다 완전한 문맥으로 간주된다. std_logic_vector가 std_ulogic 또는 STD_LOGIC 소자 하였지만, 문자열, 문자 요소 형 배열 유형으로

std_logic_vector(x"0000000000000000") 

: 볼 꼭

확장 비트 열 (15.8) 등이며 유형 (VHDL 개정판에 따라 다름). 즉, 타입 변환의 피연산자와 타입 마크는 밀접하게 관련되어 있지 않습니다.

이 규칙을 무시해서는 안됩니다.

9.3.2 리터럴

문자열 및 비트 문자열 리터럴은 1 차원 문자 배열을 나타냅니다. 문자열 또는 비트 문자열 리터럴 유형은 리터럴 자체를 제외하고 리터럴 형식이 문자 유형의 1 차원 배열이어야한다는 사실을 사용하여 리터럴이 나타나는 컨텍스트에서만 결정될 수 있습니다. 문자열과 비트 문자열 리터럴의 어휘 구조는 15 절에 정의되어 있습니다.

마찬가지로 정규 표현식을 사용할 수 있습니다.

9.3.5 공인 식

하는 규정 식 명시 적 발현 또는 집합체 인 연산의 종류 및 가능한 서브 타입을 명시하기 위해 사용되는 기본적인 동작 (5.1 참조) 인 .

두 가지 방법 모두 아래에 나와 있으며, 대부분의 지시 된 노력은 규정 된 표현으로 변경되어 추가 ' 문자 만 필요합니다.

코드는 다음 표준을 준수 VHDL 도구에 성공적으로 분석 :

library ieee; 
use ieee.std_logic_1164.all; 
-- use ieee.numeric_std.all; 

entity idexreg is 
    port(
    rst_bar : in std_logic; 
    clk : in std_logic; 
    immediate_in : in std_logic_vector(63 downto 0); 
    reg0_in : in std_logic_vector(63 downto 0); 
    reg1_in : in std_logic_vector(63 downto 0); 
    instruction_in : in std_logic_vector(3 downto 0); 
    pc_in : in std_logic_vector(3 downto 0); 
    immediate_out : out std_logic_vector(63 downto 0); 
    reg0_out : out std_logic_vector(63 downto 0); 
    reg1_out : out std_logic_vector(63 downto 0); 
    instruction_out : out std_logic_vector(3 downto 0); 
    pc_out : out std_logic_vector(3 downto 0) 
    ); 
end idexreg;  

architecture idexreg_arch of idexreg is 
begin 
    arch: process(clk, rst_bar) 
    begin 
     if rst_bar = '0' then 
      immediate_out <= std_logic_vector'(x"0000000000000000"); 
      reg0_out <= std_logic_vector'(x"0000000000000000"); 
      reg1_out <= std_logic_vector'(x"0000000000000000"); 
      instruction_out <= std_logic_vector'(x"0"); 
      pc_out <= std_logic_vector'(x"0");  
     elsif falling_edge(clk) then 
      immediate_out <= immediate_in; 
      reg0_out <= reg0_in; 
      reg1_out <= reg1_in; 
      instruction_out <= instruction_in; 
      pc_out <= pc_in; 
     end if; 
    end process; 
end idexreg_arch; 

library ieee; 
use ieee.std_logic_1164.all; 
-- use ieee.numeric_std.all; 
-- use ieee.std_logic_arith.all; 

entity idexreg_tb is 
end idexreg_tb; 

architecture test of idexreg_tb is 
--input signals 
signal rst_bar : std_logic; 
signal clk: std_logic; 
signal immediate_in : std_logic_vector(63 downto 0); 
signal reg0_in : std_logic_vector(63 downto 0); 
signal reg1_in : std_logic_vector(63 downto 0); 
signal instruction_in : std_logic_vector(3 downto 0); 
signal pc_in : std_logic_vector(3 downto 0); 

--output signals 
signal immediate_out : std_logic_vector(63 downto 0); 
signal reg0_out : std_logic_vector(63 downto 0); 
signal reg1_out : std_logic_vector(63 downto 0); 
signal instruction_out : std_logic_vector(3 downto 0); 
signal pc_out : std_logic_vector(3 downto 0); 

-- boolean to signify end of simulation 
signal end_sim : boolean := false; 

constant period : time := 50 ns; 

begin 

UUT: entity work.idexreg -- ERROR HERE was entity idexreg 
    port map (
    rst_bar => rst_bar, 
    clk => clk, 
    immediate_in => immediate_in, 
    reg0_in => reg0_in, 
    reg1_in => reg1_in, 
    instruction_in => instruction_in, 
    pc_in => pc_in, 
    immediate_out => immediate_out, 
    reg0_out => reg0_out, 
    reg1_out => reg1_out, 
    instruction_out => instruction_out, 
    pc_out => pc_out); 


-- Generate the Clock signal 
clk_gen: process 
begin 
clk <= '0'; 
loop 
    wait for period/2; 
    clk <= not clk; 
    exit when end_sim = true; 
end loop; 
wait; 
end process; 

stim: process 
begin 
    -- reset the register file first 
    rst_bar <= '0'; 
    wait for 100 ns; 
    rst_bar <= '1'; 


    --Test 1 
    immediate_in <= x"AAAAAAAAAAAAAAAA"; -- std_logic_vector'(x"AAAAAAAAAAAAAAAA"); 
    reg0_in <= std_logic_vector'(x"AAAAAAAAAAAAAAAA"); 
    reg1_in <= std_logic_vector'(x"AAAAAAAAAAAAAAAA"); 
    instruction_in <= std_logic_vector'(x"A"); 
    pc_in <= std_logic_vector'(x"1"); 
    wait for 10 ns; 
    --Test 2 
    immediate_in <= std_logic_vector'(x"BBBBBBBBBBBBBBBB"); 
    reg0_in <= std_logic_vector'(x"BBBBBBBBBBBBBBBB"); 
    reg1_in <= std_logic_vector'(x"BBBBBBBBBBBBBBBB"); 
    instruction_in <= std_logic_vector'(x"B"); 
    pc_in <= std_logic_vector'(x"2"); 
    wait for 30 ns; 
    --Test 3 
    immediate_in <= std_logic_vector'(x"CCCCCCCCCCCCCCCC"); 
    reg0_in <= std_logic_vector'(x"CCCCCCCCCCCCCCCC"); 
    reg1_in <= std_logic_vector'(x"CCCCCCCCCCCCCCCC"); 
    instruction_in <= std_logic_vector'(x"C"); 
    pc_in <= std_logic_vector'(x"3"); 
    end_sim <= true; 

    wait; 
end process; 

end test; 

그리고 위의 오류를 언급 담합 당신에게 'U의 외에 뭔가 제공 :

1][something besides 'U's합니다.

immediate_in은 비트 문자열 리터럴의 유형을 결정하기 위해 9.3.2의 규칙에 의존하는 정규 표현식을 사용하지 않는 테스트 1의 신호 할당입니다. 가장 안쪽 인 완전한 컨텍스트 (12.5)은 비트 문자열 리터럴 유형을 결정하는 데 사용되며 할당 문 자체입니다.

immediate_in 할당 방법이 일반적으로 선호되는 방법으로 널리 사용됩니다. 형식은 할당 대상에서 가져옵니다.