
int factorial(int n = 0) {
if (n == 0 || n == 1) return 1;
else return n * factorial(n - 1);
}
int main() {
int n = 10;
factorial(n);
n = 5;
factorial(n);
return 0;
}
위 프로그램을 베릴로그로 작성할 경우 다음과 같이 바꿔주면 되는데...
1) factorial이라는 모듈(함수)의 호출인자 n을 parameter라는 명령어로 정의해줍니다.
2) main이라는 모듈(함수)에서 factorial을 호출하기 위해 defparam라는 명령어로 factorial1.n = 5, factorial2.n = 10으로 정의합니다.
3) 끝으로, factorial 모듈을 호출할 경우 factorial factorial1.n (); 으로 값을 넘겨줍니다.
1~3을 정리하면, 왼쪽의 c 문법이 오른쪽의 verilog 문법으로 바뀌는 것이지요
int factorial(int n = 0) -> module factorial; paramter n = 0;
factorial(10) -> defparam param.n = 10; factorial param.n ();
int n = 5; -> defparam ex.n = 5;
factorial(n); -> factorial ex ();
(예제)
module counter;
parameter Max = 0;
integer R;
initial
for (R=l; R <= Max; R = R
+ 1)
$display ("R= %d",
R)
endmodule
module main_module;
defparam COUNTER1.Max = 5,
COUNTER2.Max = 10;
counter COUNTER1 ();
counter COUNTER2 ();
endmodule
덧붙여 설명하면 parameter는 함수의 호출인자들의 꾸러미라고 볼 수 있습니다. defparam은 호출전에 그 꾸러미의 내용이 무엇인지 값들을 할당해 주는 것이고요.
즉, 마지막에 counter COUNTER1 (); 과 같이 호출을 하게 되면, counter모듈은 그 뒤의 COUNTER1라는 꾸러미를 풀어서 그 안의 parameter 값들을 조사합니다. COUNTER1에 Max라는 이름이 5라는 값으로 배정되어 있네요. 따라서 counter는 Max = 5로 초기화한 뒤 원래의 계수 알고리즘을 수행합니다.
cf) parameter와 defparam의 EBNF는 다음과 같습니다.
parameter_declaratLon ::=
parameter <range> <list_of_assignments>;
range ::= | [<expression>
: <expression>]
list_of_assignments ::=
<parameter_assignment>
|
<parameter_assignment> , <list_of_assignments>
parameter_assignment ::= <lvalue> = <expression>