[Verilog]並列処理ブロック(fork-join)


これはシミュレーションでのみ使用される構文です.
  • 並列処理ブロック内の文は同時に実行される.
  • は、各文に割り当てられた遅延ベースまたはイベントベースの制御に基づいて文の順序を調整する.
  • 遅延ベースまたはイベントベースの制御が指定されている場合、ブロックに入る時間に関係する.
  • 街に入る時間に実行を開始します.したがって,ブロックに書かれた文の順序は重要ではない.
    シーケンス処理とパラレル処理を比較します.
    // 예 1: 지연이 있는 순차 처리 블록
    reg x, y;
    reg [1:0] z, w;
    
    initial
    begin
    	x = 1'b0; // 시간 0에 수행을 마친다.
        #5  y = 1'b1; // 시간 5에 수행을 마친다.
        #10 z = {x, y}; // 시간 15에 수행을 마친다.
        #20 w = {y, x}; // 시간 35에 수행을 마친다.
    end
    
    // 예 2: 지연이 있는 병렬 처리 블록
    reg x, y;
    reg [1:0] z, w;
    
    initial
    fork
    	x = 1'b0; // 시간 0에 수행을 마친다.
        #5  y = 1'b1; // 시간 5에 수행을 마친다.
        #10 z = {x, y}; // 시간 10에 수행을 마친다.
        #20 w = {y, x}; // 시간 20에 수행을 마친다.
    join
    シミュレーション時間をよく確認してください.
    次のコードは競合しています(シミュレーション時間は同じで、変数値はUnknown).生成されたコード.これはfork‐joinブロックの限界ではなくシミュレータの限界である.
    // 고의저인 경쟁 상태를 가진 병렬 처리 블록
    reg x, y;
    reg [1:0] z, w;
    
    initial
    fork
    	x = 1'b0;
        y = 1'b1;
        z = {x, y};
        W = {y, x};
    join
    fork:1つのストリームを複数のストリームに分割する観点
    join:分離されたストリームを1つのストリームに再結合
    無効な使命名ブロックとブロック
    begin : block1
    fork : block2
    上のようにブロックの名前を付けて使用できます.名前付きブロックはdisableを使用して無効にできます.
    disable:ブロック実行を終了する方法を提供します.制御信号に基づいてループを飛び出し、エラーを調整し、コードの一部を実行します.(breakに類似)
    // 보기 : 플래그(벡터 변수)에서 처음으로 1의 값을 갖는 비트를 찾는다.
    reg [15:0] flag;
    integer i; // 카운트하기 위한 정수
    
    initial
    begin
        flag = 16'b 0010_0000_0000_0000;
        i = 0;
        begin : block1 // while 내부의 메인 블록이 block1이라고 명명됨
    	while(i < 16) // 연산자를 사용한 여러 개의 조건.
    		begin
        			if (flag[i])
            		begin
        				$display("Encountered a TRUE bit at element number %d", i);
           	 			disable block1; // 참값을 갖는 비트를 찾았기 때문에 block1을 무효화
            		end
    			i = i + 1;
        		end
        end
    end
    beginendは必要ありませんが、名前だけで参加できます.
    以上のコードは、真の値を持つビットを検索すると、ブロックが無効になり、ループを終了します.
    [1]SAMIR PALLNITKAR,⊥Verilog HDLデジタル設計と合成の指導,第2版⊥,第7章