Verilog 수학 함수 마스터하기: 효율적인 하드웨어 설계를 위한 활용
Verilog 수학 함수는 상수 표현식 대신 사용할 수 있으며 정수와 실수 연산을 모두 지원합니다.
정수 수학 함수
$clog2 함수는 주어진 인자의 log2의 올림(ceiling) 값을 반환합니다. 이는 주로 주어진 크기의 메모리를 어드레싱하는 데 필요한 최소 비트 폭을 계산하는 데 사용됩니다.
예를 들어, 설계에 7개의 병렬 가산기가 있으면 7을 모두 표현하는 데 필요한 최소 비트 수는 7의 $clog2인 3이 됩니다.
module des #(parameter NUM_UNITS = 7)
// 이 시스템 함수를 사용하여 이 모듈의 입력 와이어 수를 줄이는 데 도움
(input [$clog2(NUM_UNITS)-1:0] active_unit);
initial $monitor("active_unit = %d", active_unit);
endmodule
`define NUM_UNITS 5
module tb;
integer i;
reg [`NUM_UNITS-1:0] active_unit;
des #(.NUM_UNITS(`NUM_UNITS)) u0(active_unit);
initial begin
active_unit = 1;
#10 active_unit = 7;
#10 active_unit = 8;
end
endmodule
active_unit 신호가 총 5개 유닛을 저장하기 위해 3비트를 가짐에 주목하세요.
시뮬레이션 로그
xcelium> run
active_unit = 001
active_unit = 111
active_unit = 000
xmsim: *W,RNQUIE: Simulation is complete.
실수 수학 함수
이 시스템 함수들은 실수 인자를 받아들이고 실수를 반환합니다.
| 함수 |
설명 |
| $ln(x) |
자연 로그 log(x) |
| $log10(x) |
상용 로그 log10(x) |
| $exp(x) |
x의 지수 함수 (ex) e=2.718281828... |
| $sqrt(x) |
x의 제곱근 |
| $pow(x, y) |
xy |
| $floor(x) |
x의 내림 |
| $ceil(x) |
x의 올림 |
| $sin(x) |
x의 사인 (x는 라디안) |
| $cos(x) |
x의 코사인 (x는 라디안) |
| $tan(x) |
x의 탄젠트 (x는 라디안) |
| $asin(x) |
x의 아크사인 |
| $acos(x) |
x의 아크코사인 |
| $atan(x) |
x의 아크탄젠트 |
| $atan2(x, y) |
x/y의 아크탄젠트 |
| $hypot(x, y) |
x와 y의 빗변: sqrt(x2 + y2) |
| $sinh(x) |
x의 쌍곡선 사인 |
| $cosh(x) |
x의 쌍곡선 코사인 |
| $tanh(x) |
x의 쌍곡선 탄젠트 |
| $asinh(x) |
x의 아크 쌍곡선 사인 |
| $acosh(x) |
x의 아크 쌍곡선 코사인 |
| $atanh(x) |
x의 아크 쌍곡선 탄젠트 |
module tb;
real x, y;
initial begin
x = 10000; $display("$log10(%0.3f) = %0.3f", x, $log10(x));
x = 1; $display("$ln(%0.3f) = %0.3f", x, $ln(x));
x = 2; $display("$exp(%0.3f) = %0.3f", x, $exp(x));
x = 25; $display("$sqrt(%0.3f) = %0.3f", x, $sqrt(x));
x = 5; y = 3; $display("$pow(%0.3f, %0.3f) = %0.3f", x, y, $pow(x, y));
x = 2.7813; $display("$floor(%0.3f) = %0.3f", x, $floor(x));
x = 7.1111; $display("$ceil(%0.3f) = %0.3f", x, $ceil(x));
x = 30 * (22.0/7.0) / 180; // 30도를 라디안으로 변환
$display("$sin(%0.3f) = %0.3f", x, $sin(x));
x = 90 * (22.0/7.0) / 180; $display("$cos(%0.3f) = %0.3f", x, $cos(x));
x = 45 * (22.0/7.0) / 180; $display("$tan(%0.3f) = %0.3f", x, $tan(x));
x = 0.5; $display("$asin(%0.3f) = %0.3f rad, %0.3f deg", x, $asin(x), $asin(x) * 7.0/22.0 * 180);
x = 0; $display("$acos(%0.3f) = %0.3f rad, %0.3f deg", x, $acos(x), $acos(x) * 7.0/22.0 * 180);
x = 1; $display("$atan(%0.3f) = %0.3f rad, %f deg", x, $atan(x), $atan(x) * 7.0/22.0 * 180);
end
endmodule
시뮬레이션 로그
xcelium> run
$log10(10000.000) = 4.000
$ln(1.000) = 0.000
$exp(2.000) = 7.389
$sqrt(25.000) = 5.000
$pow(5.000, 3.000) = 125.000
$floor(2.781) = 2.000
$ceil(7.111) = 8.000
$sin(0.524) = 0.500
$cos(1.571) = -0.001
$tan(0.786) = 1.001
$asin(0.500) = 0.524 rad, 29.988 deg
$acos(0.000) = 1.571 rad, 89.964 deg
$atan(1.000) = 0.785 rad, 44.981895 deg
xmsim: *W,RNQUIE: Simulation is complete.