Verilog에서 보다 깔끔하면서 configurable 한 코드를 만들기 위해 generate 문을 활용할 수 있다.

일반적으로 자주 사용하는 문법은 아니지만, 긴 코드를 작성할 때 유리하다.


generate 문은 일반적인 verilog 문법과는 다르게, pre-compile 된다고 이해하면 쉽다.

(C언어에서의 전처리기 명령어(#define 등)와 비슷하다.)


generate 문에는 아래와 같이 2가지 종류가 있다.

1. generate loop

일반적으로 verilog에서는 for 문을 사용하지 않는다. Verilog에서 사용하는 for 문은 사실 generate 문의 일부이다.

loop index는 genvar로 선언하여야 하며, generate loop 내에서 선언된 wire 등은 loop iteration 간의 충돌이 일어나지 않는다.(local 변수로 이해하면 된다.)

genvar idx;

generate

for(idx = 0; idx < 3; idx = idx + 1) begin : gen_inst

wire w1, w2;

assign w1 = in1[idx] & in2[idx];

assign w2 = in1[idx] | in2[idx];

assign out[idx] = w1 & w2;

end

endgenerate

위의 코드는 아래와 같다.

wire gen_inst[0].w1, gen_inst[0].w2;

assign gen_inst[0].w1 = in1[0] & in2[0];

assign gen_inst[0].w2 = in1[0] | in2[0];

assign out[0] = gen_inst[0].w1 & gen_inst[0].w2;

wire gen_inst[1].w1, gen_inst[1].w2;

assign gen_inst[1].w1 = in1[1] & in2[1];

assign gen_inst[1].w2 = in1[1] | in2[1];

assign out[1] = gen_inst[1].w1 & gen_inst[1].w2;

wire gen_inst[2].w1, gen_inst[2].w2;

assign gen_inst[2].w1 = in1[2] & in2[2];

assign gen_inst[2].w2 = in1[2] | in2[2];

assign out[2] = gen_inst[2].w1 & gen_inst[2].w2;

2. if-generate / case-generate

if-generate와 case-generate는 코드에는 등장하지만, 조건에 따라서 실제 synthesis 되지 않는 코드를 말한다.

간단히 이해하기로는, parameter 등 constant 한 값에 의한 if / case 문에서 해당될 수 없는 구문은 애초에 없는 코드로 생각하면 된다.


주의 사항

 - generate 문은 generate 와 endgenerate 사이로 구성할 수 있으나 사실 이는 필수는 아니다.

 - generate 문은 named / unamed 둘 다 가능하나, named로 사용하는 편이 좋다.


참조: http://www.verilogpro.com/verilog-generate-configurable-rtl/

'Programming > Verilog' 카테고리의 다른 글

AXI FIFO  (0) 2020.02.13
AXI Register Slice  (0) 2020.02.12
Xilinx bootgen  (0) 2017.06.21
Xilinx SDK disable cache  (0) 2017.06.12
Xilinx Vivado IP import  (0) 2017.05.31

Bash script에서 for문은 아래와 같은 형태를 가진다.

for <variable> in <list>

do

statements

done


C언어에서와 같이 i++을 진행하면서 하고자 하는 경우,

for i in `seq 1 10`;

do

statements

done

※seq 1 3 == 1,2,3

'Programming > Bash Script' 카테고리의 다른 글

Bash if statement with regex  (0) 2021.09.06
Bash script argument parsing with getopts  (0) 2020.01.23
Bash Script case statement  (0) 2018.02.06
Bash Script Variable Split by Space  (0) 2018.02.04
Bash Script Echo  (0) 2018.02.04

Swift 기본 문법 정리


1. 변수(Variable) 와 상수(Constant)

var variable_name = inital_value

let constant_name = constant_value

* 상수는 값이 변경 될 수 없음

* 안정성을 위해서는 상수를 쓸 것을 권장함

* 변수/상수 이름으로는 공백, 연산자, 화살표 등을 제외한 왠만한 Unicode 문자는 다 가능함

* 변수/상수 이름을 숫자로 시작 할 수 없음


2. 자료형(Data types)

String / Float / Int / Bool / Double / Character

var name: String = "홍길동"

var age: Int = 20

* 자료형을 입력하지 않으면 Compiler가 값을 바탕으로 자료형을 추론함


Range / ClosedRange

let underFive = 0.0..<5.0 // Range

let lowercase = "a".."z" // ClosedRange


3. 배열(Array) 과 Dictionary

Dictionary는 C 언어에는 없는 Data structure 인데, Array와 비슷함

var names: [String] = ["홍길동", "김철수", "신짱구"]

var smartphones: [String: String] = ["삼성": "갤럭시", "애플": "아이폰"]

* 변수/상수 모두 배열/Dictionary로 선언 가능

* 초기 값을 공백으로 빈 배열/Dictionary 선언 가능

* 빈 Dictionary는 대괄호 안에 :(Colon) 넣어줘야함

* 생성자(Initializer) 호출을 통해서도 빈 배열/Dictionary 선언 가능


4. 조건문과 반복문

if / else if / else

if a >= 3 && a < 5 {

//then

} else if a < 7 {

//then

} else {

//then

}

* 조건문의 조건은 Bool type 만 될 수 있음


switch / case

switch a {

case 1:

//

case 2..<5:

//

case default:

//

}

* case에 범위(Range/ClosedRange)를 지정할 수도 있음


for

for i in 0..<100 {

//

}


for name in names {

print("이름 : \(name)");

}


for (maker, brand) in smartphones {

print("\(maker) 의 smartphone brand는 \(brand) 이다.");

}

* for 문에 배열/Dictionary 를 사용할 수 있음


while

while i < 10 {

//

}


+ Recent posts