2017-10-18 2 views
-1

제 FPGA/Verilog 과정에서 교수님이 방금 기능을 검토했습니다.Verilog에서 함수는 어떻게 사용됩니까?

그는 함수 내에서 코드를 절차 적으로 작성한다고 말하고있었습니다. 그런 다음 함수를 호출하려면 항상 블록 (즉, 절차 적으로) 내에서 함수를 호출하거나 assign 문을 사용하여 함수를 호출 할 수 있습니다.

절차 코드로 함수를 작성하는 방법은 이해가되지 않지만 계속 호출 할 수는 있습니다.

누구나이 (아마) 기본적인 질문에 대한 통찰력을 가지고 있다면, 매우 감사하겠습니다.

감사

+0

그것을 설명하는 당신의 교수에게 질문

always @* begin a = b + c; d = b + a; end always @(posedge clk) begin out <= d + in; end 

이 정확히 같은 일이다. 돈 가치를 얻으십시오. – toolic

답변

0

의 Verilog 연속, 또는 다른 이벤트 기반 시뮬레이션 같은 건 없다. 모든 행동은 값을 변경하는 신호를 의미하거나 이산 시간이 경과하기를 기다리는 이산 이벤트에 의해 유도됩니다.

Verilog에서의 지속적인 할당은 표현식을 정의하는 방법 일 뿐이므로 RHS 표현식의 피연산자가 변경되면 표현식이 평가되고 그 결과가 LHS 타겟으로 전파됩니다. 논리식 또는 산술 식은 함수 호출을 포함 할 수 있습니다.

0

표현식의 피연산자로 Verilog에서 값 (비 공백 함수)을 반환하는 함수가 사용됩니다. 이 함수는 여러 개의 명령문으로 구성 될 수있는 verilog 표현식을 캡슐화합니다. 따라서 표현이 사용될 수있는 곳이면 어디든 사용할 수 있습니다. 절차 블록과 연속 할당 문은 그러한 장소입니다.

연속 할당 기간은 역사적 값이며 그 목적은 값을 그물로 유도하는 것입니다 (입력 표현식 값이 변경되면 계속해서 그물 값을 변경). 그래서, 함수가 rhs에서 사용된다면, 입력 값을 기반으로 한 값 계산을 제공 할뿐입니다.

그래서, 여기에 예입니다

function automatic reg[3:0] sum (reg[3:0] a, reg[3:0] b); 
    sum = a + b; 
endfunction // b 

reg [3:0] r; 
wire [3:0] w; 

// use function in the procedural block 
always @* 
    r = sum(a, b); 

// use function in the continuous assignment 
assign w = sum(a,b); 
0

그것은 조합 논리 블록과 동일한 정확히 꽤 많이 있습니다. 그렇게 쓰지 만 완전히 다른 것으로 합성됩니다. 다음 고려 :

function integer calc_d(integer b, integer c) begin 
    integer a; 
    a = b + c; 
    d = b + a; 
    calc_d = d; 
end 
endfunction 

always @(posedge clk) begin 
    out <= calc_c(b, c) + in; 
end 
관련 문제