2016-10-20 1 views
2

두 개의 Verilog 모듈을 만들었습니다. 첫 번째는 9 비트 숫자를 취해 첫 번째로 1의 위치를 ​​반환합니다.Verilog 모듈 인스턴스화 및 빈 시작 부분

module findPositionOf_1(
    input [8:0] data, 
    output reg [3:0] position 
); 


    always @(data) 
    begin 
    if(data==9'b0000_00000) 
     position=4'b0000; 
    else if(data[0]==1) 
     position=4'b0000; 
    else if(data[1]==1) 
     position=4'b0001; 
    else if(data[2]==1) 
     position=4'b0010; 
    else if(data[3]==1) 
     position=4'b0011; 
    else if(data[4]==1) 
     position=4'b0100; 
    else if(data[5]==1) 
     position=4'b0101; 
    else if(data[6]==1) 
     position=4'b0110; 
    else if(data[7]==1) 
     position=4'b0111; 
    else if(data[8]==1) 
     position=4'b1000; 
    end  

endmodule 

두 번째 모듈은 처음 제로로 그 비트를 변경하는 첫 번째 모듈을 호출하고 다시 다음 1.

module findPositionOf_2nd_1(
    input [8:0] r1_data, 
    output [3:0] position1 
); 

reg [3:0] pos,pos2; 
reg [8:0] temp; 

integer i; 
always @(r1_data) 
begin 
    findPositionOf_1 f1(.data(r1_data), .position(pos)); 


    i=pos; 
    temp=r1_data; 
    temp[i]=0; 
    findPositionOf_1 f2(temp,pos2); 
    if(pos2==4'b0000) 
    position1=0; 
    else 
    position1=pos2; 

end 

endmodule 

내가 무엇입니까의 발생을 찾는 1의 두 번째 발생을 반환 컴파일 중 오류가 발생했습니다. 도와주세요.

검사기 'findPositionOf_1'을 (를) 찾을 수 없습니다. 인스턴스화 'f1'은 가시성 검사기 여야합니다. 빈 몸체로 시작/끝 블록을 찾았습니다. 이 은 SystemVerilog에서는 허용되지만 Verilog에서는 허용되지 않습니다. 길잃은 세미콜론을 찾으십시오.

답변

5

당신이 코드를 작성하는 방식에 따라 Verilog (및 다른 HDL 언어)가 "정상적인"절차 적 코딩과 어떻게 다른지 완벽하게 파악하지 못했던 것처럼 보입니다.

[email protected] 블록 내부의 모든 내용이 위에서 아래로 실행되며 그 모듈은 기능과 유사하다고 가정하는 것 같습니다. 그렇지 않다. 모듈을 설계 할 때 하드웨어가 어떻게 보이는지 생각해야합니다.

이 경우 두 개의 findPositionOf_1 모듈이 필요하다는 것을 알고 있습니다. 첫 번째 (u_f1)의 결과가 두 번째 (u_f2)의 입력에 영향을 주길 원한다는 것을 알고 있습니다. 이렇게하려면 두 모듈을 인스턴스화 한 다음 모듈 간의 상호 연결을 결정하십시오.

우리는 왼쪽 이동 시간의 '1pos 수 (1<<pos)에 의해 위치 pos에 1 벡터를 만들 수 있습니다. XOR - 보내고 함께 비트를함으로써, 문 r1_data^1<<pos 당신은 문법적으로 잘못된 절차 블록, 인 항상 블록 내부에 모듈을 인스턴스화 한 원치 않는 1

module findPositionOf_2nd_1(input [8:0] r1_data, output [3:0] position1); 
wire [3:0] pos,pos2; 
wire [8:0] temp; 

    findPositionOf_1 u_f1(.data(r1_data), .position(pos)); 
    findPositionOf_1 u_f2(.data(temp), .position(pos2)); 

    assign temp = r1_data^(1<<pos); 
    assign position1 = pos2; 

endmodule 
+0

왜 인스턴스화는 항상 블록에서 발생 될 수 없다 도움이 될 것입니다. 나는 Verilog에 매우 익숙하다. – panshul

1

제거합니다. 둘째, 첫 번째 모듈을 함수 호출로 사용했습니다. 허용되지 않습니다. 마찬가지로, 당신은 두 모듈을 연결하고 점검 할 수있는 별도의 테스트 벤치가 필요합니다. findPositionOf_2nd_1 모듈의 입력으로 첫 번째 발생 위치를 만듭니다. 귀하의 질문에 대해, 아마도이

Why can't I instantiate inside the procedural block in Verilog

관련 문제