분류 전체보기

    [Verilog] 루프문 - while, for, repeat, forever

    모든 루프 문장들은 행위 수준 문장이므로 initial, always 블록 안에 위치한다. 또한 루프는 지연 시간을 포함할 수 있다. 기본적으로 while과 for의 사용법은 C에서와 같다. repeat repeat은 정해진 횟수만큼 루프를 수행한다. 루프의 횟수는 시작할 때에만 계산되고, 도중에 루프의 횟수를 표현하기 위해 사용된 변수의 값이 변하더라도 횟수가 변하지 않는다. repeat(128) begin $display("Count = %d", count); count = count + 1; end forever forever 루프는 무한루프와 같다. $finish, $stop, disable을 통해 종료/중단할 수 있다. initial forever @(posedge clock) x = y;

    [Verilog] case, casex, casez문

    case case문은 기본적으로 C언어의 switch와 비슷하다. 키워드 case, endcase, default 키워드로 구성되어있다 . case (alu_control) 2'd0 : y = x + z; 2'd1 : y = x - z; default : $display("Invalid ALU control signal"); endcase case문은 x와 z까지 포함하여 각각의 비트를 비교한다. 만일 비트 폭이 일치하지 않으면 비트 폭이 더 큰 쪽에 맞추어서 나머지를 0으로 채운다. casez casez는 case 선택, case 수식의 모든 z값을 dont care로 간주한다. 따라서 z가 아닌 비트만을 비교할 수 있다. casex casex는 모든 x, z값을 dont care로 간주한다.

    [Verilog] 사건 기반 타이밍 제어

    사건이란 레지스터, 혹은 넷의 값 변화를 의미한다. 사건 기반 타이밍 제어에는 정규 사건 제어(regular event control), 명명된 사건 제어(named event control), 사건 OR 제어(event OR control), 준위-구동 타이밍 제어(level-sensitive timing control) 4가지 형태가 존재한다. 엣지 트리거링으로 사건을 제어할 때에는 기호 @을 사용하며, 준위 트리거링으로 제어할 때는 키워드 wait을 사용한다. 정규 사건 제어 정규 사건 제어는 클럭의 상승, 하강 엣지를 지정할 수 있다. @(clock) q = d; //클럭이 변할 때(클럭의 엣지에서) 수행 @(posedge clock) q = d; //클럭의 상승 엣지에서 수행 @(negedge ..

    [Verilog] 지연 기반 타이밍 제어

    지연 기반 타이밍 제어는 기호 #을 사용한다. 정규 지연 제어(regular delay control), 내부 할당 지연 제어(intra-assignment delay control), 제로 지연 제어(zero delay control) 세 가지의 형태가 있다. 정규 지연 제어 정규 지연 제어는 절차적 할당의 왼쪽에 0이 아닌 지연을 지정하는 방식이다. 문장을 만나는 시점을 기준으로 지연을 수행하고, 문장을 뒤이어 수행한다. 내부 할당 지연 제어 내부 할당 지연 제어는 할당 연산자의 오른쪽에 지연을 지정한다. rvalue에 대한 값의 계산을 마친 후 지연을 수행한다. 즉 말 그대로 '할당'에 대해서만 지연을 수행하는 것이라고 할 수 있다. 제로 지연 제어 제로 지연 제어는 말 그대로 제로지연, #0이며,..

    [Verilog] 절차적 할당 - 블록킹과 논블록킹

    절차적 할당(procedural assignments)는 연속적 할당과는 다른 개념이다. [Verilog] 데이터 플로우 모델링, assign 연속 할당문 데이터 플로우 수준은 게이트 수준보다 한 단계 더 추상화된 수준의 모델링 기법이다. (근데 나는 아직 공부를 별로 안해서 그런지 게이트 수준이랑 엄청나게 큰 차이는 못느끼겠다.... 어쨌든 katteniiki.tistory.com 연속 할당문의 경우 lvalue가 넷이었던 반면, 절차적 할당에서는 레지스터가 온다. 절차적 할당은 한번 할당되면 다른 값으로 갱신하기 전까지 그 값을 유지한다. 절차적 할당에서 lvalue가 될 수 있는 것으로는 다음과 같은 것들이 있다. reg, integer, real, 시간 레지스터, 메모리 요소 이러한 변수들의 비트..

    [Verilog] initial과 always 구문

    모든 행위 수준 문장은 반드시 initial, always 블록 안에 있어야 한다. 각 initial, always 블록은 분리되어 수행되며, 서로 중첩될 수 없다. 여러 문장은 begin, end를 통해 묶어준다.(C에서의 중괄호와 같은 역할) initial initial 블록은 시간 0에서 시작되고, 시뮬레이션동안 단 한 번만 수행된다. 여러개의 initial 블록이 있다면 동시에 시간 0에서 시작되며 각각 독립적으로 실행을 마치게 된다. initial m = 1'b0; initial begin #5 a = 1'b1; // #은 문장을 만나고 수행되기까지의 지연시간 #25 b = 1'b0; end // 시간 0일 때 m = 1'b0 수행 // 시간 5일 때 a = 1'b1 수행 // 시간 30일 때 ..

    [Verilog] 연산자 정리

    C나 C++에 없거나 혹은 일반적인 SW 프로그래밍을 할 때 잘 쓰이지 않는 연산자들 위주로 정리함. 연산자 심볼 수행되는 연산 피연산자의 개수 ** 제곱 승 2 === 케이스 등가 연산자 2 !== 케이스 비등가 연산자 2 ^ 비트단위 xor 2 ^~ 또는 ~^ 비트단위 xnor 2 >> 오른쪽 자리 이동 2 > 수학적 오른쪽 자리 이동 2 > 1 // Y = 4'b0110 오른쪽으로 1비트 자리 이동 Y = X

    [Verilog] 데이터 플로우 모델링, assign 연속 할당문

    데이터 플로우 수준은 게이트 수준보다 한 단계 더 추상화된 수준의 모델링 기법이다. (근데 나는 아직 공부를 별로 안해서 그런지 게이트 수준이랑 엄청나게 큰 차이는 못느끼겠다.... 어쨌든 데이터 플로우 수준도 회로를 먼저 그려야 하는 건 똑같지 않나.... 내가 C나 C++에 더 익숙해서 그렇게 느끼는 듯..) +) 완전다름!! 이땐 왜 그렇게 생각했을까 연속 할당문은 어떤 값을 넷에 할당하기 위해 사용된다. wire out; assign out = in1 & in2; //또는 다음의 방식도 가능하다. wire out = in1 & in2; 연속 할당문의 특징은 다음과 같다. 연속 할당문의 왼쪽은 항상 넷이어야 한다.(스칼라, 벡터 모두 가능) 연속 할당문은 항상 능동적으로, 오른쪽 피연산자들의 값이 ..