Study/Digital System Design and Lab[Verilog]

#2 Verilog Description of Digital Systems(Verilog Assignments)

얼죽아여뜨샤 2023. 10. 11. 16:22

*Verilog Description of Combinational Circuits

  • A signal assignment statement has the form
    : Assign [#delay] signal_name = expression;
    (square brackets indicate that #delay is optional)
  • Concurrent statements (continuous assignments) examples 1-2

assign의 순서가 바뀌어도 다른 Hardware이 설계되진 않는다. (순서중요X)

assign #10 A = ~A
//A를 10ns 이후 inversion시켜라

=> state를 바꾸는 주기적 신호

 

Q. A대신 CLK은 왜 사용 못하는가?

A. CLK의 data type(wire or reg)두가지 인데 wire은 값을 기억하지 않고 초기값 지정 불가하다.

하지만 CLK은 초기값을 설정해줘야해서 wire사용 불가능하다.

 

assign [x] -> always [O]

ex) reg CLK = 0;

 

  • Concurrent statements (continuous assignments) examples 1-2

// When A changes, these concurrent statements all execute at the same time

assign #2 D = A && B;

assign #1 E = ~A;

assign #3 F = A || C;
  • & : 비트연산자(bitwise)
    && : 논리연산자
    => 두개의 bit차이가 달라서 &하나짜리 사용이 더 낫다.
1. 비트연산자 
| : "0001 | 0000 == 0001”이 성립합니다. 즉, 하나의 비트 비교시 하나라도 1이라면 1이 됩니다.
& : |와는 다르게 두 비트 모두가 1인 경우만 1이 됩니다.즉, "0101 & 0100 == 0100”이 됩니다.
2. 논리연산자
||(or) : 하나라도 true인 경우 true를 반환합니다. 즉, “true || false == true”가 됩니다.
&&(and) : 모두 true인 경우만 true를 반환합니다. 즉, “true && true == true, true && false == false”가 됩니다.

 

// the hard way
assign C[3] = A[3] && B[3];
assign C[2] = A[2] && B[2];
assign C[1] = A[1] && B[1];
assign C[0] = A[0] && B[0];
// the easy way assuming C, A and B are 4-bit vectors

wire[3:0] C //초기 bit할당 필요
assign C = A & B;

 

  • Data Types
    : Reg(register) and wire
    Registers are used to store values.
    => continuous assignment 사용해 결과 저장되는 것을 주로 사용
    Wires cannot hold a value; they are used to link modules of combinational logic.
  • Verilog supports data structures called arrays, memory arrays, and vectors.
    : An array is a collection of objects with the same attributes (more on arrays and memory arrays later...).
    : A vector is a one-dimensional array of bit signals.

*Verilog Modules

  • Module : basic building block

module two_gates (A, B, D, E);
output E;
input A, B, D; //input과 output 한줄로 선언 가능
wire C, E;

	assign C = A && B; //concurrent
    assign E = C || D; //statements
endmodule
  • module - endmodule : module의 시작과 끝.
  • two_gates : module name.
  • (A, B, D, E) : optional port list.
  • output, input : the list-of-interfaceports
  • Positional asociation : listing the ports in order.
    => module만들 때 선언한 변수 순서를 잘 기억해서 사용해야한다.
  • Named association (described in Chapter 8) : signals can be in any order as long as the signals in the module are connected to the ports by name.

  • Example for a Full Adder: 

2023.10.04 - [Study/Digital System Design and Lab] - #1-1 Design a full adder

 

  • 4-bit Adder

=> Full adder 4개를 복사해서 4 bit adder를 설계할 것이다.

*Verilog Assignments[새로운 값 할당 방법]

  • Continuous assignments : used to assign values for combinational logic circuits.
    - Two types
    : Explicit continuous assignments : uses the assign keyword after the net is separately declared.
    => wire A;
         assign #5 A = B & C;
    : Implicit continuous assignments : assign the value in declaration without using the assign keyword.
    => wire A = B & C; //assign 생략가능

  • Procedural assignments : used to model registers and finite state machines using the always keyword.
    => sequential logic 설계시 주로 사용한다.(combination logic에서도 사용하기도 함)
    - Two types
    : Initial blocks execute only once at time zero.
    => module설계시 initial block은 잘 사용하지 않는다.
    주로 test bench안에서 사용한다.
    initial block은 회로로 합성이 되지 않기 때문이다.

    : Always block loop to execute over and over again.
    => 조건 나올때까지 반복한다.

*Verilog Procedural Assignments

  • An initial statement has the form:
initial
begin
	sequentual-statements
end
  • An always statement has the form:
always@(sensitivity-list)
begin
	sequential-statements
end
  • sensitivity-list : 바뀌면 always문을 수행할 것인지 오른쪽 할당된 값을 모두 써줘야 한다.
EX)
A = B + C; //A는 B와 C가 바뀌면 계산이 된다.
always@(B or C) //B와 C가 바뀔 때 아래 문장들을 수행하라
...
...

always@(*) //오른쪽 모두를 해당하는 말이 된다.

EX)
always@(posedge clk)
//가로안을 보고 combination or sequential logic인지 알 수 있다.
  • begin-end : executed sequentially rather than concurrently
  • Sensitivity list:
    - Combinatorial always blocks:
    condition statement(if문과 유사한 것)속 모든 신호들을 포함하고 오른쪽의 assignment의 모든 신호들을 포함한다.
    - Sequential always blocks:
    list는 3종류의 edge-triggered를 포함한다 : clock, reset, and signal event

  • reg D, E; : 수행되어 결과를 저장하는 부분은 reg type(저장할 수 있는 type)
  • always@(*) = always@(A or B or C or D)
  • Sequential statements can be evaluated in two different ways:
    - Blocking assignment<Combinational logic에서 사용>
    : sequential block에서 수행하면서 next statement로 가기 전에 오른쪽 statement를 순차적으로 수행되게 만들고 싶을 때 사용한다.
    Uses the "=" operator
    - Non-blocking assignment<Sequential logic에서 사용>
    : always block안의 모든 문장을 한꺼번에 동시에 수행하고 싶을 때 사용한다.
    Uses the "<=" operator

회로 동작이 다른 alwyas구문

  • 첫 번째 always는 순차적으로 수행되기 때문에 
    A = 3, B = 5일 때 A = 5  다음에 B = 5로 수행된다.
  • 두 번째 always는 동시에 수행되기 때문에
    C = 3, D = 5일 때 C = 5 D = 3으로 SWIPs하게 수행된다.
  • Data Types:
    - Wire
    : 정보를 저장할 수 없다.
    : 초기 값이 다르다.
    : Combinational logic일 때 사용한다.
    : assign문의 좌변에 사용할 수 있지만, always@ 블록에서'=' '<=' 의 좌변에 사용할 수 없다.

    - Reg
    : Register은 값을 저장할 수 있다.
    : 초기 값은 x(unknown)이다.
    : Combinational and Sequential logic에서 사용한다.

    : assign문의 좌변에 사용할 수 없지 만, always@블록에서 '=' <='의 좌변에 사용할 수 있다.

*some Verilog syntax(rules)

 

 

 

 

 

'Study > Digital System Design and Lab[Verilog]' 카테고리의 다른 글

#3 Modeling Flip-Flops Using Always Block  (0) 2023.10.14
#2-2 Multiplexer Design  (0) 2023.10.11
#2-1 Design a 4-Bit Adder  (0) 2023.10.11
#1-1 Design a full adder  (1) 2023.10.04
#1 Digital Circuit Design  (0) 2023.10.03