2012-03-31 4 views
3

VHDL에 관한 강의를 듣고 Verilog를 배우기 시작했습니다. 행동 진술이 실행되는 순서를 이해하는 데 어려움을 겪고 있습니다. 여기에 문제의 코드가 있습니다. 여기 Verilog 실행 순서

//This files is an experiment into the order in which verilog executes it's statements 

module MainCircuit(clk, start); 

    parameter cycles = 8; 
    input clk; 
    input start; 
    //input [15:0] data; 

    integer i; 

    always @(posedge clk) 
    begin 
     if(start) 
     begin 
      i=0; 

      repeat(cycles) 
      begin 
       @(posedge clk) $display("%d\ti = %d", $time, i); 
       i = i + 1; 
      end 
     end 
    end 

endmodule 

module tester; 

    reg clk; 
    wire start; 

    assign start = 1'b1; 
    initial clk = 1'b0; 

    MainCircuit myMain(clk, start); 
    initial repeat(40) 
    begin 
     #5 clk = 1'b1; 
     #5 clk = 1'b0; 
    end 

endmodule 

내가 각각의 긍정적 인 클럭 에지에서 0으로 재설정되지 않는 이유를 이해하지 않는 출력

    15 i =   0 
        25 i =   1 
        35 i =   2 
        45 i =   3 
        55 i =   4 
        65 i =   5 
        75 i =   6 
        85 i =   7 
       105 i =   0 
       115 i =   1 
       125 i =   2 
       135 i =   3 
       145 i =   4 
       155 i =   5 
       165 i =   6 
       175 i =   7 
       195 i =   0 
       205 i =   1 
       215 i =   2 
       225 i =   3 
       235 i =   4 
       245 i =   5 
       255 i =   6 
       265 i =   7 
       285 i =   0 
       295 i =   1 
       305 i =   2 
       315 i =   3 
       325 i =   4 
       335 i =   5 
       345 i =   6 
       355 i =   7 
       375 i =   0 
       385 i =   1 
       395 i =   2 

입니다. myMain이 실행중인 곳을 기억하고 시계가 호출 될 때마다 거기에서 계속합니까? 그렇다면 어디에서 멈출 것입니까? 그리고이 모든 것이 어떻게 합성 될까요?

다른 두 가지 사소한 질문 :

나는 < = 1'b01 시작을 작성하는 시도; 대신 할당 시작 = 1'b01; 두 번째 모듈에 있지만 작동하지 않습니다. 왜 안돼?

두 번째는 출력에서 ​​이상한 간격이 무엇입니까?

감사합니다.

답변

4
  1. always @(posedge clk)은 모든 클럭 에지에서 자동으로 실행되지 않습니다. always 블록은 현재 실행이 끝나면 다시 시작될 수 있습니다 (동시에 두 개의 스레드가 블록을 실행할 수는 없습니다). 귀하의 always 블록은 귀하의 (반복 사이클) 루프에 걸려 있기 때문에 8 클럭 이후까지 end에 도달하지 않습니다. 8 개의 포즈 클이 끝난 후에야 루프를 끝내고 항상 블록의 끝을 쳐야하고 다음 포즈에 다시 시작합니다.

  2. start <= 1'b1은 비 차단 할당이며 항상 블록 내에서만 실행할 수 있습니다.

  3. $ 표시는 아마도 32 비트 10 진수의 최대 값을 인쇄 할 수있는 충분한 공간을 확보하고있을 것입니다. 여분의 공간을 모두 원하지 않으면 %d 대신 %0d을 사용해보십시오.

+0

감사합니다. 처음 게시 할 때와 나는 Verilog 섹션이 그리 활성화되지 않을까 걱정했습니다. 1) 그래서 실행은'@ (posedge clk) $ display ("% d \ ti = % d", $ time, i); 또한, 어떻게 이것이 논리로 합성됩니까? 2) 입력을 회로에 연결하는 표준 방법은 어느 것입니까? 저는 할당과 항상 둘 다 절차 코드의 블록이라고 생각했지만 하드 와이어 링은 게이트 수준의 것보다 더 많은 것을 보았습니다. –

+0

@ChrisMorin 대부분의 섹션보다 덜 활동적 일지 모르지만 대부분의 질문은 적어도 하나 또는 두 개의 답변을 얻는 것처럼 보입니다. 예, 실행은 표시 줄에서 일시 중지됩니다. @ (posedge clk)는 "시계의 포지티브 에지까지 여기에서 기다린 다음 다음 문장을 실행하십시오"를 의미합니다. 나는 정확히 '어떻게 합성 된 것인가?'라고 대답하는 방법을 확신하지 못합니다 ... 출력과 비슷하게 8 비트까지 실행 한 후 반복합니다. 입력을 단단히 연결하는 방법은 DUT의 포트를 상수 값으로 설정하는 assign 문에 아무런 문제가 없습니다. – Tim