자료형과 연산자 Sun, Hye-Seung
logic zero, or false condition logic one, or true condition 2.1.1 Verilog의 논리값 표 2.1 Verilog의 논리값 집합 논리값 의 미 logic zero, or false condition 1 logic one, or true condition x unknown logic value z high-impedance state
2.1.1 Verilog의 논리값 Zero, low, false, logic low, ground, VSS ‘0’ ‘1’ ‘x’ ‘z’ Zero, low, false, logic low, ground, VSS One, high, true, logic high, power, VDD, VCC X, unknown : occurs at logical conflict which cannot be resolved HiZ, high impedence, tri-stated, disabled or disconnected driver
net 자료형과 variable 자료형의 할당 모드 Verilog HDL의 자료형 Net 자료형 : 소자간의 물리적인 연결을 추상화 wire, tri, wand, wor, triand, trior, supply0, supply1, tri0, tri1, trireg Default 자료형 ; 1비트의 wire Variable 자료형 : 절차형 할당문 사이의 값의 임시 저장 프로그래밍 언어의 variable과 유사한 개념 reg, integer, real, time, realtime net 자료형과 variable 자료형의 할당 모드 Yes No Comb (No) Seq (Yes) Variable Net force… release PCA assign… deassign PCA 절차형 할당문 연속 할당문 프리미티브 출력 할당 모드 자료형 * PCA : Procedural Continuous Assignment
2.1.2 net 자료형 net 자료형 논리 게이트나 모듈 등의 하드웨어 요소들 사이의 물리적 연결을 나타내기 위해 사용 연속 할당문(continuous assignment), 게이트 프리미티브 등과 같은 구동자(driver)의 값에 의해 net의 값이 연속적으로 유지됨 값을 저장하지 않음 (단, trireg net는 예외) 구동자가 연결되지 않으면, default 값인 high-impedance (z)가 됨 단, trireg net는 이전에 구동된 값을 유지 default 자료형은 1비트의 wire default 초기값은 z trireg net는 default 초기값으로 x를 가짐
2.1.2 net 자료형 표 2.2 Verilog net 자료형 wire tri wand wor triand trior 자료형 이름 의 미 wire 함축된 논리적 동작이나 기능을 갖지 않는 단순한 연결을 위한 net tri 함축된 논리적 동작이나 기능을 갖지 않는 단순한 연결을 위한 net이며, 하드웨어에서 3상태(tri-state)가 되는 점이 wire와 다름 wand 다중 구동자를 갖는 net이며, ‘wired-and’(즉, open collector logic)의 하드웨어 구현을 모델링하기 위해 사용 wor 다중 구동자를 갖는 net이며, ‘wired-or’(즉, emitter coupled logic)의 하드웨어 구현을 모델링하기 위해 사용 triand wand와 동일하게 다중 구동자를 갖는 net이며, 하드웨어에서 3상태(tri-state)를 갖는 점이 다름 trior wor와 동일하게 다중 구동자를 갖는 net이며, 하드웨어에서 3상태(tri-state)를 갖는 supply0 회로접지(circuit ground)에 연결되는 net supply1 전원(power supply)에 연결되는 net tri0 저항성 pulldown (resistive pulldown)에 의해 접지로 연결되는 net tri1 저항성 pullup (resistive pullup)에 의해 전원으로 연결되는 net trireg 물리적인 net에 저장되는 전하를 모델링하는 net
2.1.2 net 자료형 wire w1, w2; // declares two wires, 생략 가능 wire [7:0] bus; // a 8-bit bus wire enable=1'b0; // wire with initial value of 0 wand w3; // a scalar net of type wand tri [15:0] busa; // a three-state 16-bit bus
2.1.2 net 자료형 wire와 tri 표 2.3 wire, tri net의 진리표 회로 구성요소들 사이의 연결에 사용 wire : 단일 게이트 또는 단일 연속 할당문에 의해 구동되는 net에 사용 tri : 3상태 net에 사용 표 2.3 wire, tri net의 진리표 wire/tri 1 x z
2.1.2 net 자료형 wired net 다중 구동자를 갖는 설계를 지원하기 위해 사용 표 2.4 wand, triand net의 진리표 표 2.5 wor, trior net의 진리표 wand/ triand 1 x z wor/ trior 1 x z
2.1.2 net 자료형 module wand_ex ; reg a, b, c; wire w_nor, w_buf, w_wire; wand w_wand; initial begin a=0; b=0; c=0; #50 a=1; b=1; end nor(w_nor, a, b); buf(w_buf, c); nor(w_wire, a, b); buf(w_wire, c); nor(w_wand, a, b); buf(w_wand, c); endmodule 코드 2.1 시뮬레이션 결과
2.1.2 net 자료형 tri0와 tri1 tri0 : 저항성 pull-down에 의해 접지로 연결되는 net에 사용 tri1 : 저항성 pull-up에 의해 전원으로 연결되는 net에 사용 구동자에 의해 구동되지 않으면 net의 값은 1 표 2.6 tri0 net의 진리표 표 2.7 tri1 net의 진리표 tri0 1 x z tri1 1 x z
2.1.3 variable 자료형 variable 자료형 ; reg, integer, real, time, realtime 절차적 할당문(procedural assignment)의 실행에 의해 그 값이 바뀌며, 할당에서부터 다음 할당까지 값을 유지 default 초기값 reg, time, integer 자료형 : x (unknown) real, realtime 자료형 : 0.0 variable이 음의 값을 할당 받는 경우, signed reg, integer, real, realtime 자료형 : 부호를 유지 unsigned reg, time 자료형 : unsigned 값으로 취급
2.1.3 variable 자료형 reg 절차적 할당문에 의해 값을 받는 객체의 자료형 할당 사이의 값을 유지 하드웨어 레지스터를 모델링하기 위해 사용될 수 있음 edge-sensitive (플립플롭 등)와 level-sensitive (래치 등)의 저장소자들을 모델링할 수 있음 reg는 조합논리회로의 모델링에도 사용되므로, reg가 항상 하드웨어적인 저장소자를 의미하지는 않음 reg a; // a scalar reg reg[3:0] v; // a 4-bit vector reg made up of(from most to // least significant) v[3], v[2], v[1], and v[0] reg signed [3:0] signed_reg; // a 4-bit vector in range -8 to 7 reg [-1:4] b; // a 6-bit vector reg reg [4:0] x, y, z; // declares three 5-bit regs
2.1.3 variable 자료형 module dff (clk, d, q); input d ,clk; output q; reg q; always @(posedge clk) q <= d; endmodule module mux21_if(a, b, sel, out); input [1:0] a, b; input sel; output [1:0] out; reg [1:0] out; always @(a or b or sel) if(sel == 1'b0) out = a; else out = b; endmodule D 플립플롭 2 : 1 MUX
2.1.3 variable 자료형 integer 자료형 time 자료형 real, reatime 자료형 정수형 값을 취급하며, 절차적 할당문에 의해 값이 변경됨 signed reg로 취급되며, 연산 결과는 2의 보수가 됨 time 자료형 시뮬레이션 시간을 처리하거나 저장하기 위해 사용됨 64비트의 reg와 동일하게 작용 unsigned 값이고 unsigned 연산이 이루어짐 real, reatime 자료형 실수형 값을 취급 integer a; // integer value time last_chng; // time value real float ; // a variable to store real value realtime rtime ; // a variable to store time as a real value
2.1.4 벡터 벡터 범위지정 [msb:lsb] 을 갖는 다중 비트의 net 또는 reg 자료형 signed로 선언되거나 signed로 선언된 포트에 연결되는 경우를 제외하고는 unsigned로 취급 단일 할당문으로 값을 받을 수 있음 data_type [msb:lsb] identifier; reg [7:0] rega; // 8-bit reg wire [15:0] d_out; // 16-bit wire
2.1.5 배열 배열 별도의 자료형이 없으며, reg 또는 wire 선언을 이용하여 선언 배열 전체 또는 일부분은 단일 할당문에 의해 값을 할당 받을 수 없으며, 또한 수식에 사용될 수 없음 배열을 구성하는 element만 단일 할당문으로 값을 할당 받을 수 있음 RAM, ROM, Register File 등의 메모리 모델링에 사용 data_type identifier [Uaddr:Laddr][Uaddr2:Laddr2]; data_type [msb:lsb] identifier [Uaddr:Laddr][Uaddr2:Laddr2];
2.1.5 배열 reg [7:0] mema[0:255]; // a memory mema of 256 8-bit registers reg arrayb[7:0][0:255]; // a 2-D array of 1-bit registers wire w_array[7:0][5:0]; // an array of wires integer inta[1:64]; // an array of 64 integer values time chng_hist[1:1000]; // an array of 1000 time values mema = 0; // Illegal syntax- Attempt to write to entire array arrayb[1] = 0; // Illegal Syntax - Attempt to write to elements // [1][0]..[1][255] arrayb[1][12:31] = 0; // Illegal Syntax - Attempt to write to // elements [1][12]..[1][31] mema[1] = 0; // Assigns 0 to the second element of mema arrayb[1][0] = 0; // Assigns 0 to the bit referenced by indices [1][0] inta[4] = 33559; // Assign decimal number to integer in array chng_hist[t_index] = $time; // Assign current simulation time to // element addressed by integer index
2.1.5 배열 메모리 reg형 요소를 갖는 1차원 배열 메모리 전체가 단일 할당문으로 값을 할당 받을 수 없음 인덱스로 지정되는 워드 단위로만 값을 할당하거나 수식에 사용될 수 있음 reg [1:n] rega; // An n-bit register reg mema [1:n]; // A memory of n 1-bit registers
2.1.6 parameter parameter variable 또는 net 범주에 속하지 않는 상수값 회로의 비트 크기 또는 지연값을 지정하기 위해 사용 defparam 문 또는 모듈 인스턴스 문의 parameter overriding에 의해 값을 변경시킬 수 있음 자료형과 범위지정을 가질 수 있음 범위가 지정되지 않은 경우, 상수 값에 적합한 크기의 비트 폭을 default로 가짐 parameter msb = 7; // defines msb as a constant value 7 parameter e = 25, f = 9; // defines two constant numbers parameter r = 5.7; // declares r as a real parameter parameter byte_size = 8, byte_mask = byte_size - 1; parameter average_delay =(r + f) / 2; parameter signed [3:0] mux_selector = 0; parameter real r1 = 3.5e17; parameter p1 = 13'h7e; parameter [31:0] dec_const = 1'b1; // value converted to 32 bits parameter newconst = 3'h4; // implied range of [2:0]
모듈 인스턴스의 parameter overriding module modXnor (y_out, a, b); parameter size=8, delay=15; output [size-1:0] y_out; input [size-1:0] a, b; wire [size-1:0] #delay y_out= a ~^ b; // bit-wise XNOR endmodule module Param; wire [7:0] y1_out; wire [3:0] y2_out; reg [7:0] b1, c1; reg [3:0] b2, c2; modXnor G1 (y1_out, b1, c1); // use default parameters modXnor #(4, 5) G2 (y2_out, b2, c2); // overrides default parameters 모듈 인스턴스의 parameter overriding // Primitive instantiation with 3 units of delay nand #3 G1 (out_nd2, in0, in1); primitive gate의 delay 모듈 인스턴스는 지연을 가질 수 없음 게이트 프리미티브의 인스턴스는 파라미터 overriding을 가질 수 없음
2.2 Verilog의 연산자 표 2.8 Verilog HDL의 연산자 연산자 기 능 {}, {{}} 결합, 반복 ^ ^ 비트 단위 exclusive or +, -, *, /, ** 산술 ^~ 또는 ~^ 비트 단위 등가 % 나머지 & 축약 and >, >=, <, <= 관계 ~& 축약 nand ! 논리 부정 | 축약 or && 논리 and ~| 축약 nor || 논리 or ^ 축약 xor == 논리 등가 축약 xnor != 논리 부등 << 논리 왼쪽 시프트 === case 등가 >> 논리 오른쪽 시프트 !== case 부등 <<< 산술 왼쪽 시프트 ~ 비트 단위 부정 >>> 산술 오른쪽 시프트 & 비트 단위 and ? : 조건 비트 단위 inclusive or or Event or
2.2 Verilog의 연산자 표 2.9 실수형 수식에 사용될 수 있는 연산자 연산자 기 능 +, -, *, /, ** 산술 표 2.9 실수형 수식에 사용될 수 있는 연산자 연산자 기 능 +, -, *, /, ** 산술 || 논리 or +, - 부호 == 논리 등가 >, >=, <, <= 관계 != 논리 부등 ! 논리 부정 ? : 조건 && 논리 and or Event or
2.2 Verilog의 연산자 표 2.10 Verilog 연산자의 우선순위 +, -, !, ~ (단항) Highest precedence ** *, /, % +, -(이항) <<, >>, <<<, >>> <, <=, >, >= ==, !=, ===, !== &, ~& ^, ^~, ~^ |, ~| && || ? : (conditional operator) Lowest precedence
2.2 Verilog의 연산자 integer IntA, IntB, IntC, IntD; IntA = -12 / 4; // The result is -3. IntB = -'d12 / 4; // The result is 1073741821. IntC = -'sd12 / 4; // The result is -3. IntD = -4'sd12 / 4; // -4'sd12 is the negative of the 4-bit 1100, // which is -4. -(-4) = 4. The result is 1.
2.2.1 산술 연산자 피연산자의 비트에 x (unknown)나 z (high-impedance)가 포함된 경우에는 전체 결과 값은 x가 됨 나누기와 나머지 연산자에서 두 번째 피연산자가 0인 경우, 결과값은 x가 됨 나머지 연산자의 결과 값은 첫번째 피연산자의 부호를 따름 거듭제곱 연산자에서 다음의 경우에는 결과 값이 정의되지 않음 첫번째 피연산자가 0이고 두 번째 피연산자가 양수가 아닌 경우 첫번째 피연산자가 음수이고 두 번째 피연산자가 정수 값이 아닌 경우 표 2.11 산술 연산자 기 호 기 능 + 더하기 - 빼기 * 곱하기 / 나누기(몫) % 나머지(modulo) ** 거듭제곱(power)
2.2.1 산술 연산자 표 2.12 나머지 연산자의 연산 결과 수 식 결과값 설 명 10 % 3 1 표 2.12 나머지 연산자의 연산 결과 수 식 결과값 설 명 10 % 3 1 10을 3으로 나눈 나머지는 1 11 % 3 2 11을 3으로 나눈 나머지는 2 12 % 3 12를 3으로 나눈 나머지는 0 -10 % 3 -1 결과 값은 첫번째 피연산자의 부호를 따름 11 % -3
2.2.1 산술 연산자 표 2.13 산술 연산자에서의 자료형 해석 자료형 해 석 unsigned net Unsigned 표 2.13 산술 연산자에서의 자료형 해석 자료형 해 석 unsigned net Unsigned signed net Signed, 2’s complement unsigned reg signed reg integer time real, realtime Signed, floating-point
2.2.1 산술 연산자 integer intA; reg [15:0] regA; reg signed [15:0] regS; intA = -4'd12; regA = intA / 3; // 결과 값은 -4 // intA는 integer 자료형이고, regA는 65532 regA = -4'd12; // regA는 65524 intA = regA / 3; // 결과 값은 21841 intA = -4'd12 / 3; // 결과 값은 1431655761 // -4d'12는 32-bit reg 자료형 regA = -12 / 3; // 결과 값은 -4, -12는 integer 자료형 // regA는 65532 regS = -12 / 3; // 결과 값은 -4. regS는 signed reg regS = -4'sd12 / 3; // 결과 값은 1. -4'sd12는 실제로 4이므로 // 정수 나눗셈 규칙에 의해 4/3=1이 된다.
2.2.2 관계 연산자 표 2.14 관계 연산자 산술 연산자보다 낮은 우선 순위를 가짐 피연산자의 비트에 x (unknown)나 z(high-impedance)가 포함된 경우에는 결과 값은 1비트의 x가 됨 두 피연산자의 비트 수가 다른 경우에는, 비트 수가 작은 피연산자의 MSB 쪽에 0이 채워져 비트 수가 큰 피연산자에 맞추어진 후, 관계를 판단함 피연산자 중 하나가 실수형이면 다른 피연산자가 실수형으로 변환된 후, 비교됨 표 2.14 관계 연산자 관계 연산자 식 의 미 a < b a가 b보다 작다 a > b a가 b보다 크다 a <= b a가 b보다 작거나 같다 a >= b a가 b보다 크거나 같다
2.2.2 관계 연산자 // A = 9, B = 4 // D = 4'b1001, E = 4'b1100, F = 4'b1xxx E >= D // 결과 값은 참(1) E < F // 결과 값은 x ⓛ a < b-1 // ⓛ과 ②는 결과가 동일 ② a <(b-1) ③ b-(1 < a) // ③과 ④는 결과가 다를 수 있음 ④ b-1 < a
2.2.3 등가 연산자 표 2.15 등가 연산자 관계 연산자 보다 낮은 우선순위를 가짐 피연산자의 비트끼리 비교 두 피연산자의 비트 수가 다른 경우에는, 비트 수가 작은 피연산자의 MSB 쪽에 0이 채워져 비트 수가 큰 피연산자에 맞추어진 후, 등가를 판단함 case equality와 case inequality 연산자(===, !==)는 대부분의 EDA 툴에서 논리합성이 지원되지 않으므로, 합성을 위한 RTL 수준의 모델링에는 사용하지 않는 것이 좋음 표 2.15 등가 연산자 관계 연산자 식 의 미 a === b a와 b는 같다. (x와 z가 포함된 일치를 판단) a !== b a와 b는 같지 않다. (x와 z가 포함된 불일치를 판단) a == b a와 b는 같다. (결과가 x가 될 수 있음) a != b a와 b는 같지 않다. (결과가 x가 될 수 있음)
2.2.3 등가 연산자 // A = 9, B = 4 // D = 4'b1001, E = 4'b1100 // F = 4'b1xxz, G = 4'b1xxz, H = 4'b1xxx A === B // 결과 값은 거짓(0) D != E // 결과 값은 참(1) D == F // 결과 값은 x F === G // 결과 값은 참(1) F === H // 결과 값은 거짓(0) G !== H // 결과 값은 참(1)
2.2.4 논리 연산자 참 또는 거짓의 판단이 모호한 경우에는 결과값은 x 논리 연산자 식 의 미 a && b 의 미 a && b a와 b의 논리 AND a || b a와 b의 논리 OR !a a의 부정 (NOT a) // A = 3, B = 0, C = 2'b0x, D = 2'b10인 경우에, A && B // 결과 값은 0 A || B // 결과 값은 1 !A // 결과 값은 0 !B // 결과 값은 1 C && D // 결과 값은 x
2.2.4 논리 연산자 // alpha = 237, beta=0인 경우에, regA = alpha && beta; // regA에는 0이 할당된다. regB = alpha || beta; // regB에는 1이 할당된다. a < size-1 && b != c && index != last_one (a < size-1) && (b != c) && (index != last_one) // recommended if(!reset)
2.2.5 비트 연산자 피연산자의 해당 비트들에 대한 연산을 수행 피연산자의 비트 수가 같지 않으면, 비트 수가 작은 피연산자의 MSB 위치에 0이 채워진 후, 연산됨 표 2.16 비트 and 연산자 표 2.17 비트 or 연산자 & 1 x z | 1 x z
2.2.5 비트 연산자 표 2.18 비트 xnor 연산자 표 2.19 비트 xor 연산자 ~^ 1 x z ^ 1 x z 1 x z ^ 1 x z 표 2.20 비트 부정 연산자 // D = 4'b1001, E = 4'b1101, F = 4'b10x1 ~D // 결과 값은 4'b0110 D & E // 결과 값은 4'b1001 D | E // 결과 값은 4'b1101 D ^ E // 결과 값은 4'b0100 D ~^ E // 결과 값은 4'b1011 D & F // 결과 값은 4'b10x1 ~ 1 x z
2.2.6 축약 연산자 단항 연산자 피연산자의 단위 비트들에 적용되어 단일 비트의 결과값을 생성 reg[7:0] cnt; assign parity = ^cnt; assign parity = cnt[7]^cnt[6]^cnt[5]^cnt[4]^cnt[3]^cnt[2]^cnt[1]^cnt[0]; 표 2.21 축약 and 연산자 축약 nand 연산자 & 1 x z ~& 1 x z
2.2.6 축약 연산자 표 2.22 축약 or 연산자 축약 nor 연산자 | 1 x z ~| 1 x z 1 x z ~| 1 x z 표 2.23 축약 xor 연산자 축약 xnor 연산자 ^ 1 x z ~^ 1 x z
2.2.6 축약 연산자 연산자 피연산자 연산 결과 설 명 & ~& | ~| ^ ~^ 4'b0000 1 모든 비트가 0인 경우 연산자 피연산자 연산 결과 설 명 & ~& | ~| ^ ~^ 4'b0000 1 모든 비트가 0인 경우 4'b1111 모든 비트가 1인 경우 4'b0110 1의 개수가 짝수인 경우 4'b1000 1의 개수가 홀수인 경우
2.2.7 시프트 연산자 논리 시프트 연산자 ( <<, >> ) << : 우측 피연산자 값만큼 좌측으로 시프트 후, 비어 있는 비트에 0을 채움 >> : 우측 피연산자 값만큼 우측으로 시프트 후, 비어 있는 비트에 0을 채움 산술 시프트 연산자 ( >>>, <<< ) <<< : 우측 피연산자 값만큼 좌측으로 시프트 후, 비어 있는 비트에 0을 채움 >>> : 우측 피연산자 값만큼 우측으로 시프트 후, 비어 있는 비트에 좌측 피연산자의 MSB를 채움 우측 피연산자 x 또는 z가 포함된 경우, 시프트 연산의 결과 값은 x 항상 unsigned 수
2.2.7 시프트 연산자 // A = 4'b1100 B = A >> 1 // 오른쪽으로 1비트 시프트, 결과 값은 B=4'b0110 C = A << 1 // 왼쪽으로 1비트 시프트, 결과 값은 B=4'b1000 D = A << 2 // 왼쪽으로 2비트 시프트, 결과 값은 B=4'b0000 논리 시프트 연산 module shift; reg [3:0] start, result; initial begin start = 1; result =(start << 2); // 결과 값은 0100 end endmodule
2.2.7 시프트 연산자 산술 시프트 연산 module ashift; reg signed [3:0] start, result; initial begin start = 4'b1000; result =(start >>> 2); // 결과 값은 1110 end endmodule
2.2.8 조건 연산자 조건 연산자 expression1이 참(1, 즉 0, x 또는 z가 아닌 값)으로 평가되면 expression2의 값이 좌변의 변수에 할당 expression1이 거짓(0)으로 평가되면 expression3의 값이 좌변의 변수에 결과 값으로 할당 expression1이 x 또는 z이면(즉, 참 또는 거짓을 판단할 수 없는 모호성이 존재하는 경우), expression2와 expression3을 함께 평가하여 비트 단위로 비교된 값이 좌변의 변수에 할당 expression3이 real 형 값이 아니면 결과 값은 비트 단위로 비교되어 결정되며, real 형 값인 경우에는 결과 값은 0이 됨 conditional_expression ::= expression1 ? expression2 : expression3
표 2.24 조건에 애매성이 존재하는 경우의 조건 연산자의 결과 값 결정 2.2.8 조건 연산자 표 2.24 조건에 애매성이 존재하는 경우의 조건 연산자의 결과 값 결정 ? : 1 x z 조건 연산자를 이용한 3상태 버퍼 wire [15:0] busa = drive_busa ? data : 16'bz;
2.2.9 결합 및 반복 연산자 결합 연산자 중괄호 { }에 의해 묶인 두 개 이상의 표현이 갖는 비트들을 결합 중괄호 { }에 의해 묶인 두 개 이상의 표현이 갖는 비트들을 결합 결합되는 피연산자들은 각각의 크기를 결정할 수 있어야 결합이 가능 unsized 상수는 결합 연산자로 결합시킬 수 없음 {a, b[3:0], w, 3'b101} //결합 연산자의 결과 {a, b[3], b[2], b[1], b[0], w, 1'b1, 1'b0, 1'b1}
2.2.9 결합 및 반복 연산자 결합 연산자 대입문의 좌측 또는 우측에 사용 가능 비트 폭이 일치하지 않는 변수의 연산이나 대입이 허용됨 우변의 비트 폭이 작은 경우, 우변의 MSB에 0을 붙여 연산 됨 좌변의 비트 폭이 우변 보다 작을 경우, MSB는 누락되어 저장 wire [15:0] addr_bus; assign addr_bus = {addr_hi, addr_lo}; // addr_hi, addr_lo는 8 비트 신호 wire [3:0] a, b, sum; wire carry; assign {carry, sum} = a + b; // 4비트 데이터의 덧셈은 5비트 결과 // 좌변이 5 비트이므로, 우변의 a+b는 MSB에 0을 붙인 5비트로 연산 됨
2.2.9 결합 및 반복 연산자 반복 연산자 {a{b}}의 형태로 표현하여 b를 a회 반복 반복 횟수 a는 0, x, z가 아닌 상수이어야 함 {4{w}} // {w, w, w, w}와 동일한 표현. a[31:0] = {1'b1, {0{1'b0}} }; // 우변이 {1'b1}가 되므로 잘못된 표현임. a[31:0] = {1'b1, {1'bz{1'b0}} }; // 우변이 {1'b1}가 되므로 잘못된 표현임. a[31:0] = {1'b1, {1'bx{1'b0}} }; // 우변이 {1'b1}가 되므로 잘못된 표현임. result = {func(w), func(w), func(w), func(w)}; result = {4{func(w)}}; // 위의 문장과 동일함. {b, {3{a, b}}} // {b, a, b, a, b, a, b}와 동일함.
할당문 Sun, Hye-Seung
할당문 할당문 연속 할당문 : net형 객체에 값을 할당 절차형 할당문 : variable형 객체에 값을 할당 assign 문 절차형 할당문 : variable형 객체에 값을 할당 always 블록, initial 블록, task, function 내부의 할당문 blocking 할당문 : 할당기호 = 을 사용 nonblocking 할당문 : 할당기호 <= 을 사용 절차형 연속 할당문 (Procedural Continuous Assignment; PCA) assign - deassign 문, force - release 문 continuous_assign ::= assign [driving_strength] [delay] net_assignments;
좌변 (Left-hand Side; LHS) 할당문 표 4.1 할당문 좌변의 형태 할당문 형태 좌변 (Left-hand Side; LHS) 연속 할당 Net (vector or scalar) Constant bit select of a vector net Constant part select of a vector net Constant indexed part select of a vector net Concatenation of any of the above four LHS 절차형 할당 Variables (vector or scalar) Bit-select of a vector reg, integer, or time variable Constant part select of a vector reg, integer, or time variable Memory word Indexed part select of vector reg, integer, or time variable Concatenation of regs; bit or part selects of regs
4.1 연속 할당문 연속 할당문 assign 문을 이용하여 net형 객체에 값을 할당 우변의 값에 변화(event)가 발생했을 때 좌변의 객체에 값의 할당이 일어남 단순한 논리 표현을 이용한 조합논리회로 모델링에 이용 함축적(implicit) 연속 할당문 net 선언문에 연속 할당문을 포함시킨 경우 wire mynet = enable & data; wire mynet; assign mynet = enable & data; 함축적 연속 할당문과 등가
4.1 연속 할당문 assign na = ~(in1 & in2); // 2 input NAND assign out = (sel==1) ? d1 : d0; // 2-to-1 MUX assign carry = (cnt10==4’h9); assign sum = a + b; // 덧셈 회로 연속 할당문을 이용한 4비트 가산기 module adder (sum_out, carry_out, carry_in, ina, inb); output [3:0] sum_out; output carry_out; input [3:0] ina, inb; input carry_in; assign {carry_out, sum_out} = ina + inb + carry_in; endmodule 코드 4.1
4.1 연속 할당문 연속 할당문을 이용한 16비트 출력 버스 코드 4.2 module select_bus (busout, bus0, bus1, bus2, bus3, enable, s); parameter n = 16; parameter Zee = 16'bz; output [1:n] busout; input [1:n] bus0, bus1, bus2, bus3; input enable; input [1:2] s; tri [1:n] data; // net declaration // 연속 할당을 갖는 net 선언(함축적 연속 할당문) tri [1:n] busout = enable ? data : Zee; // 4개의 assign 문을 이용한 표현 assign data =(s == 0) ? bus0 : Zee; assign data =(s == 1) ? bus1 : Zee; assign data =(s == 2) ? bus2 : Zee; assign data =(s == 3) ? bus3 : Zee; /* 하나의 assign 문으로 4개의 연속 할당을 표현(위의 4개의 assign 문과 등가임) assign data =(s == 0) ? bus0 : Zee, data =(s == 1) ? bus1 : Zee, data =(s == 2) ? bus2 : Zee, data =(s == 3) ? bus3 : Zee; */ endmodule 연속 할당문을 이용한 16비트 출력 버스 코드 4.2
4.1.1 할당 지연과 net 지연 연속 할당문의 지연값 지정 assign 뒤에 지연 연산자(#)를 사용하여 지정 우변 피연산자 값의 변화에서부터 그 값이 좌변에 할당되기까지의 시간 간격을 지정 net 지연 net 선언문에서 지연 값을 지정 지정된 net 지연이 경과한 후에 할당이 이루어 짐 해당 net를 구동하는 모든 구동자 (게이트 프리미티브, 연속 할당문 등)에 영향을 미침 assign #10 wireA = a & b; wire #10 wireA = a & b; // 함축적 연속 할당문의 지연 wire #10 wireA;
4.1.1 할당 지연과 net 지연 관성지연 (inertial delay) Verilog HDL의 default 지연 지정된 지연 값보다 입력 신호의 변화 폭이 작은 경우, 입력 신호의 변화가 출력에 영향을 미치지 않음 관성지연은 게이트 수준 모델링에도 동일하게 적용 관성지연의 적용 과정 ① 우변 수식의 값이 평가된다. ② 평가된 우변의 값이 좌변에 할당 예정된 값과 다르면, 현재 예정된 할당 event가 취소된다. ③ 새로운 우변의 값이 좌변의 현재 값과 동일하면 할당을 위한 event가 예정되지 않는다. ④ 새로운 우변의 값이 좌변의 현재 값과 다르면, 지연이 계산되고 주어진 지연 후에 새로운 할당 event가 일어나도록 예정된다.
4.1.1 할당 지연과 net 지연 module inertial_delay(); reg a, b; assign #30 wireA = a & b; initial begin a = 1'b0; b = 1'b0; #50 a = 1'b1; b = 1'b1; #50 a = 1'b0; #20 b = 1'b0; #50; end endmodule 코드 4.3
4.1.1 할당 지연과 net 지연 코드 4.3의 시뮬레이션 결과
4.2 절차형 할당문 절차형 할당문 reg, integer, real, time, realtime 등 variable에 값을 갱신 지연을 갖지 않으며, 다음 절차형 할당문에 의해 값이 갱신될 때까지 변수에 할당된 값을 유지 always, initial, task, function 등의 프로시저(procedure) 내부에서 사용 문장의 실행에 의해 좌변 variable에 값이 할당되는 소프트웨어적인 특성 우변 수식의 event 발생과는 무관 할당문들의 순서가 시뮬레이션 결과에 영향을 미칠 수 있음 함축적 변수 할당문 variable 선언문에서 variable에 대한 초기 값을 설정 배열에 대한 함축적 변수 할당은 허용되지 않음
4.2 절차형 할당문 함축적 변수 할당문과 등가 module proc_assignment(a, b, c, out); input a, b; output out; reg out, c; always @(posedge c) begin c = a & b; // blocking assignment out <= c; // nonblocking assignment end endmodule 코드 4.4 reg[3:0] areg = 4'h4; reg[3:0] areg; initial areg = 4'h4; 함축적 변수 할당문과 등가 reg [3:0] array [3:0] = 0; //illegal (배열에 대한 함축적 변수 할당문)
4.3 절차형 연속 할당문 (PCA) 절차형 연속 할당문 (Procedural Continuous Assignment; PCA) 절차형 할당문의 예외적인 구문 variable 또는 net에 대해 연속적 구동을 허용하는 절차형 할당문 assign - deassign 문 assign PCA 문 : reg 형 variable에 연속 할당문인 assign을 사용하여 절차형 할당을 덮어쓰기(override)하는 예외적인 구문 deassign PCA 문 : variable에 대한 assign PCA 문의 영향을 제거 force-release 문 assign - deassign 문과 기능이 동일하나, force는 variable뿐만 아니라 net에도 사용될 수 있음 variable에 대한 force 문 : release 문이 실행되기 전까지 절차형 할당 또는 PCA 문을 덮어쓰기 한다. net에 대한 force 문 : release 문이 실행되기 전까지 net, 게이트 및 모듈 출력, 연속 할당문 등의 모든 driver를 덮어쓰기 한다.
edge-triggered D 플립플롭의 비동기 clear/preset 동작 모델링 4.3 절차형 연속 할당문 (PCA) edge-triggered D 플립플롭의 비동기 clear/preset 동작 모델링 module dff(q, d, clear, preset, clock); output q; input d, clear, preset, clock; reg q; always @(clear or preset) if(!clear) assign q = 0; else if(!preset) assign q = 1; else deassign q; always @(posedge clock) q = d; endmodule 코드 4.5
4.3 절차형 연속 할당문 (PCA) module force_release; reg a, b, c, d; wire e; and and1(e, a, b, c); initial begin $monitor("%d d=%b,e=%b", $time, d, e); assign d = a & b & c; a = 1; b = 0; c = 1; #10; force d =(a | b | c); force e =(a | b | c); #10 $stop; release d; release e; #10 $finish; end endmodule 0 d=0,e=0 10 d=1,e=1 20 d=0,e=0 코드 4.6