2014-05-12 4 views
0

Salsa20 스트림 암호 용 VHDL 코드를 작성 중입니다. 그것의 주요 기능은 내가 성공적으로 작성한 '분기 별'입니다. 계속 진행하기 전에 Modelsim에서 테스트하고 싶지만 어려움을 겪고 있습니다. 출력을 관찰하기 위해 입력을 '자극'해야한다는 것을 이해합니다. 내가 시도한 모든 시도는 어떤 값도주지 않은 출력 z가되었습니다. 이다 (최상위)에 Quarterround위한 코드 :Modelsim (Altera) 용 VHDL 테스트 벤치

LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 

ENTITY quarter_round is 
    GENERIC(l:integer:=9); 
    PORT(y : in unsigned(127 downto 0); 
    z : out unsigned(127 downto 0) 
    ); 
END quarter_round; 

ARCHITECTURE quarter_round_arch of quarter_round is 

COMPONENT left is            
    GENERIC(l:integer);          
    PORT(a: in unsigned(31 downto 0); 
    b: out unsigned(31 downto 0)); 
    end COMPONENT; 
    signal i1,i2,i3,i4 :unsigned(31 downto 0); 
    signal j1,j2,j3,j4 :unsigned(31 downto 0); 
    signal z0,z1,z2,z3 :unsigned(31 downto 0); 
    signal y0 : unsigned(31 downto 0);     
    signal y1 : unsigned(31 downto 0);     
    signal y2 : unsigned(31 downto 0); 
    signal y3 : unsigned(31 downto 0); 

BEGIN                 
    y0 <=y(127 downto 96);         
    y1 <=y(95 downto 64);         
    y2 <=y(63 downto 32); 
    y3 <=y(31 downto 0); 
    i1<=y0+y3; 
    a1:left generic map(7) port map(i1,j1);   
    z1<=j1 xor y1;            
    i2<=z1+y0; 
    a2:left generic map(9) port map(i2,j2); 
    z2<=j2 xor y2; 
    i3<=z2+z1; 
    a3:left generic map(13) port map(i3,j3); 
    z3<=j3 xor y3; 
    i4<=z3+z2; 
    a4:left generic map(18) port map(i4,j4); 
    z0<=j4 xor y0; 
    z<=z0&z1&z2&z3; 
END quarter_round_arch; 

성분 왼쪽 : I 작성려고 테스트 벤치는 Y 값을 할당한다

LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 

ENTITY left is 
GENERIC (l:integer:=7); 
PORT(n: in unsigned(31 downto 0); 
m: out unsigned(31 downto 0)); 
END left; 

ARCHITECTURE dataflow of left is 
    begin 
    m<=n(31-l downto 0)& n(31 downto 31-l+1); 
END dataflow; 

(128 비트) 함수를 처리하면 z는 Modelsim에서 정답을 출력해야합니다. 이것이 VHDL의 기본적인 질문이라는 것을 알지만, 그것은 내 견과를 몰고 간다!

이 코드는 실패 ModelSim을 :

LIBRARY ieee;            
USE ieee.std_logic_1164.all;         
USE ieee.numeric_std.all; 

ENTITY quarter_round_vhd_tst IS 
END quarter_round_vhd_tst; 

ARCHITECTURE test of quarter_round_vhd_tst IS 

COMPONENT quarter_round 
PORT (
    y : IN STD_LOGIC_VECTOR(127 DOWNTO 0); 
    z : OUT STD_LOGIC_VECTOR(127 DOWNTO 0) 
    ); 
    END COMPONENT; 
    SIGNAL clk : std_logic := '0'; 
    SIGNAL reset : std_logic := '0';          
    SIGNAL y : STD_LOGIC_VECTOR(127 DOWNTO 0); 
    SIGNAL z : STD_LOGIC_VECTOR(127 DOWNTO 0);        
    BEGIN 
    DUT : quarter_round 
    PORT MAP (
    y => y, 
    z => z 
    ); 

    y <= x"201f1e1d1c1b1a191817161514131211"; 

PROCESS 
BEGIN 
    clk <= '0' ; 
    wait for 10 ns; 
    z <= y ; 
    clk <= '1'; 
    wait for 10 ns; 
    END PROCESS; 
    END test; 

편집 :이 최근의 시도이다. 코드가 컴파일되지만 ModelSim은 유형이 일치하지 않는다는 오류를줍니다. CT

+0

(예 :'1 ns의 대기 시뮬레이션 시간의 경과와 함께 대기 문을 삽입;. '전후' y "할당 시간이없는 파형 표시는 아무 것도 표시 할 수 없으며 결과를 표시하기 위해 보고서 문을 사용할 수도 있습니다. 샘플 코드가 종합적으로 분석 및 정교화되지 못하게하는 많은 오류가 있습니다 – user1155120

답변

0

david_koontz : 맥북 @ GHDL -a quarter_round.vhdl
david_koontz : GHDL -e quarter_round_vhd_tst
quarter_round.vhdl : 100 : 1 : 성분 "quarter_round"로부터 신호 인터페이스 "Y"의 유형 및 엔티티 "quarter_round"의 포트 "y"가 과 호환되지 않습니다. quarter_round.vhdl : 100 : 1 : 유형 "quarter_round"및 포트 "z"의 신호 인터페이스 "z"에서 엔티티 "quarter_round"가 없습니다. 관련 ghdl 호환 : 컴파일 오류

그래서 수정 후 설명하는 문제는 정교화 과정에서 나타납니다. 구성 요소 선언의 유형과 quarter_round 엔터티가 일치하지 않습니다.

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

entity quarter_round_vhd_tst is 
end quarter_round_vhd_tst; 

architecture test of quarter_round_vhd_tst is 

    component quarter_round 
     port (
      y: in unsigned(127 downto 0); 
      z: out unsigned(127 downto 0) 
     ); 
    end component; 

    signal clk : std_logic := '0'; 
    signal reset : std_logic := '0'; 
    signal y : unsigned(127 downto 0); 
    signal z : unsigned(127 downto 0); 
begin 
DUT: quarter_round 
     port map (
      y => y, 
      z => z 
     ); 

CLOCK: 
    process 
    begin 
     wait for 10 ns;  
     clk <= not clk; 
     if Now > 30 ns then 
      wait; 
     end if; 
    end process; 

STIMULUS: 
    process 
    begin 
     wait for 10 ns; 
     y <= x"201f1e1d1c1b1a191817161514131211"; 
     wait for 10 ns; 
     -- z <= y ; 
     wait; 
    end process; 
end test; 

변화는 당신이 더 추가하면 가능성이 당신이 필요합니다, 시계에 대한 별도의 프로세스에 대한 것입니다. 당신은 원래 테스트 벤치에서 Z를 할당하려고 Z는 quarter_round의 출력이다.

나는 y 과제를 자극 과정으로 옮겼습니다. 재설정이 사용되면 해당 설정을 다시 사용할 수 있습니다.

인수없이 대기 문을 사용하여 뒤에 아이디어는 끝없이 반복에서 프로세스를 중지하는 것입니다. 신호를 할당하는 한 Time'HIGH까지 갈 것입니다. Now in process CLOCK에 대한 비교는 여러 자극 또는 실행 시간으로 변경할 수 있습니다. 마찬가지로 당신은 시뮬레이션의 끝을 신호 (최종) 모델에서 나오는 뭔가가 있다면, 시계를 중지하려면 지금 대신 사용되는 프로세스 (예를 들어, STIMULUS)에 할당 된 시계를 중지하는 데 사용되는 신호를 도입 할 수 있습니다. 클럭에 의존하지 않고 DUT

는 (또는 리셋) 즉시 Y가 할당 될 때, Z는 결과에 할당된다. (나는 이것을 설명하기 위해 y를 할당하기 전에 지연을 넣어 이유입니다).

나는 quarter_round를 사용했고 어제 수정했기 때문에 내 것이 m과 n 대신 a와 b를가집니다.

quarter_round_vhd_test

그래서 결과는 제대로 보이지 않습니다?

무언가를 되 찾는 데 어려움을 겪으면서 순차적 인 프로세스가 진행되면 좋은 진행을 시작해야합니다.

그리고 당신은 라운드 분기 포트 맵 형식 변환을 사용할 수 있습니다

signal y : std_logic_vector(127 downto 0); 
    signal z : std_logic_vector(127 downto 0); 
begin 
DUT: quarter_round 
     port map (
      y => unsigned(y), 
      std_logic_vector(z)=> z 
     ); 

그러나 구성 요소 선언은 여전히 ​​quarter_round의 엔티티 선언 일치해야합니다.

그리고 당신은 당신이 구성 요소 선언 제거, 당신이 직접 개체 인스턴스화를 사용할 수있는 테스트 벤치에 quarter_round 구성 할 필요가 없을거야 확실 경우 :

-- component quarter_round 
    --  port (
    --   y: in unsigned(127 downto 0); 
    --   z: out unsigned(127 downto 0) 
    -- ); 
    -- end component; 
    ... 

begin 
DUT: -- quarter_round 
    entity work.quarter_round 
     port map (
      y => unsigned(y), 
      std_logic_vector(z)=> z 
     ); 

유효한 요소 선언을 가지고 일반적으로 유용 또는 최소한 공식적인 연관성을 사용하려면 (위치 대신에 위의 내용은 공식적인 것임). 그런 식으로 코드를 읽는 사람은 다른 곳을 보면서 인수를 계산할 필요가 없습니다. 직접 인스턴스화 개체 라이브러리를 지정하는 선택 이름으로 지정

공지 사항 엔티티가에서 발견된다

+0

자세한 답변을 주셔서 감사합니다 David, 그 자리에 있습니다! –

0

"left.vhd"와 관련된 컴파일 오류를 간과 한 상태 여야합니다. 신호 "a"및 "b"는 신고되지 않습니다. 맥북 @

+0

사실 'm & n'. 여기에 'a & b'형식으로 썼습니다, 사과. –