2013-05-23 4 views
1

현재 Verilog를 가르치고 있으며 내가 찾은 튜토리얼과 두 가지를 혼동하는 것은 입력을 변경 한 후 지연해야하는 시간을 구체적으로 계산하는 방법입니다 조합 회로 및 항목이 코드에서 실행되는 순서. 일반적으로 실제 회로에는 상승/하강 지연 시간이 있으며 출력을 계산하기 전에 입력 값이 생성되도록 출력을 지연시키고 싶지만 구체적인 것을 알고 싶습니다.Verilog 및 타이밍의 지연 계산에 대한 세부 정보

그래서, 여기에 예는 다음과 같습니다

module dflipflop (d,clk,reset,q); 
input d, clk, reset; 
output q; 
reg q; 

always @ (posedge clk or posedge reset) begin 
    if (reset) begin 
    q <= 0; 
    else begin 
    q <= #2 d; //why did I need to delay this 2 time units? 
    end 
end 
end module 

module main; 
reg d, clk, rst; 
wire q; 
dflipflop dff(d,clk,rst,q); 

inital begin 
    forever begin 
    clk = 0; 
    #5 
    clk = 1; 
    #5 
    clk = 0; //why do I need to reset the clk to 0 if this is a forever block and my first assignment is clk = 0 in the beginning? 
    end 
end 

initial begin 
    d=0; rst=1; 
    #4 //why #4? How did they calculate that? 
    d=1; rst=0; 
    #50 
    d=1; rst=1; 
    #20 
    d=0; rst=0; 
end 
end module 

내 질문의 일부는 코드의 주석에 포함됩니다. 그러나, 다른 혼란은 타이밍입니다. 메인 모듈의 시작 부분에서 위의 main에서 정의한 매개 변수를 사용하여 dff라는 dflipflop 모듈을 인스턴스화합니다. 내 코드에서 다음과 같이 말합니다 : 모듈을 다시 빌드하거나 메인에서 입력을 변경할 때 Q를 다시 계산합니까? 링크가 보이지 않습니다.

+1

내 게시물을 투표하려면 다음 번에 개선 할 수있는 이유를 알려주세요. –

답변

4

: 당신은하지 않습니다

//why did I need to delay this 2 time units?

여기

은 무슨 일이 일어나고 있는지에 대한 단계 구매 단계입니다. 리셋 브랜치가 아니라 클럭 브랜치에 전송 지연을 추가하는 것은 거의 또는 전혀 의미가 없습니다.

//why do I need to reset the clk to 0 if this is a forever block and my first assignment is clk = 0 in the beginning?

당신은하지 않습니다; 모델에 결함이 있습니다. 첫 번째 clk=0을 제거하거나 forever 위로 옮깁니다.

//why #4? How did they calculate that?

어떤 아이디어는 - 그것은 당신의 자극 생성 단지 임의의 지연이 없습니다. 그것이 충분히 길면 중요하지 않습니다.

일반 포인트 :

    당신은 HDL 코드를 작성하는 지연을 지정에 대한 상관 없어
  1. ; 이 은 거의 항상 도구에 대한 작업입니다. 귀하의 도구는 실리콘 지연을 처리하고 sdf, specify blocks 등을 사용하여 코드에 백 - 주석을 달아줍니다. 자세한 내용은 신시사이저 또는 배치 및 라우트 도구에서 시뮬레이션 모델 출력을 확인하십시오.
  2. 명시 적으로 지연을 넣지 않았더라도 차단 및 비 차단 할당의 사용에주의하는 한 코드는 '작동합니다'. '작업 중'은 필요한 기능을 유지하기 위해 출력이 올바른 순서로 변경됨을 의미합니다.
  3. '상승/하강 지연'과 '출력 지연'에 대한 이해가 혼란 스럽다고 생각합니다. 일반적으로 HDL 레벨에서는 신호 상승 또는 하강 시간에 신경 쓰지 않습니다. 모든 것은 임계 전압에서 발생합니다. 입력은 시간 x에서 변경되고 종속 출력은 나중에 변경됩니다. 이것은 전파 지연입니다. 클록 된 회로의 경우, 지연은 출력이 0으로가는 지 또는 1로가는 지에 따라 달라 지므로 '상승 지연'또는 '하강 지연'(실제로는 1 또는 0으로 전달 지연)과 관련된 용어로 불리합니다. 출력을 계산하기 전에 입력 값이 생성되도록 출력을 지연시키지 마십시오. 예외적 인 경우를 제외하고는 출력을 즉시 계산 한 다음 출력이 실제로 모델 핀에 전파되는 데 걸리는 시간을 지정합니다.
+0

좋아요, 지연 중 일부는 다소 임의적이라는 것을 알고있는 것이 좋습니다. 나는 당신이 non-blocking을 사용하고 할당을 차단하는 것이 매우 중요하다는 것을 알고 있지만, 특정한 지연의 결합은 나를 혼란스럽게합니다. 전달 지연 v.s.을 정리해 주셔서 감사합니다. 상승/하강 시간 지연 혼란도 포함됩니다. –

1

dflipflop 모듈을 합성 할 경우 #2 지연이 없어야합니다. 때때로 사람들은 다양한 코딩 스타일 (행동 및 구조)을 혼합하여 시뮬레이션하기 때문에 이러한 지연을 추가하기도합니다. 때로는 구조 코드가 지연되어 행동 코드가 잘못 작동합니다.

는 아마도 이것은 의도 된 것입니다 :

inital begin 
    clk = 0; 
    forever begin 
    #5 
    clk = 1; 
    #5 
    clk = 0; 
    end 
end 

는 아마도 #4 단지 시간 = 5에서 1 clk 가장자리 전에 rst을 해제하는 데 사용되었다.

1

q <= #2 d; 이것은 clock-to-q 지연입니다. 이 숫자는 임의적 일 가능성이 높지만 특정 플립 플롭 디자인의 특성에 따라 달라질 수 있습니다. 많은 설계자들은 파형을보다 쉽게 ​​볼 수 있도록 clock-to-q에 약간의 지연을 걸었습니다. 일반적으로이 숫자는 매우 작고 거의 항상 시계 기간보다 짧습니다.

클럭 생성기의 경우, 추가로 clock = 0은 세미콜론이있는 한 중요하지 않습니다. 대부분이 디자이너가 사용하기를 좋아하는 코딩 스타일입니다. 다음 모두는 다르게 작성, 당신의 시계에 해당합니다 : 디자이너 (#5 @) 제 1 클럭 전에 디자인의 리셋을 종료 테스트를 원했기 때문에

always begin 
    clk = 0; 
    #5; 
    clk = 1; 
    #5; 
end 
// or 
initial begin 
    clk = 0; 
    forever #5 clk = !clk; 
end 

#4입니다. 이것은 또한 다음과 같은 지연 (클록주기의 배수 인) (#10) 및 #1 설정 시간을 제공합니다.

posedge clk 또는 posedge reset 인 경우에만 반응합니다. reset이 높으면 q0에 할당됩니다. reset이고 양수 모서리가 clk 인 경우 d이 샘플링되고 #2 후자가 샘플링 된 값을 q에 할당합니다.특정 질문에

initial begin 
    d=0; rst=1; /* simulation time #0, rst goes 1'bx->1'b1 (posedge) therefore q goes 1'bx->1'b0 */ 
    #4 
    d=1; rst=0; /* 
     simulation time #4, rst goes low, sill no posedge clk therefore dflipflop does nothing 
     simulation time #5 first posedge clk therefore sample d (1) 
     simulation time #7 q is assigned to 1 (sampled d) 
     simulation time #15 posedge clk therefore sample d (1) again 
     simulation time #17 q is assigned to 1 (sampled d) again 
     ... repeat pattern ... 
     simulation time #45 posedge clk therefore sample d (1) again 
     simulation time #47 q is assigned to 1 (sampled d) again */ 
    #50 
    d=1; rst=1; /* 
     simulation time #54, rst goes high therefore assign q to 0 
     simulation time #55 posedge clk, rst==1 therefore assign q to 0 
     simulation time #65 posedge clk, rst==1 therefore assign q to 0 */ 
    #20 
    d=0; rst=0; /* 
    simulation time #74, rst goes low therefore no change 
    simulation time #74, initial block ends */ 
end 
+0

단계별로 감사합니다. 특정 값이 업데이트되는 방식을 이해하는 데 도움이되었습니다. –