Verilog 数学函数
Verilog 数学函数可以用来代替常量表达式,并且支持 integer 和真实的 数学。
整数数学函数
函数$clog2
返回给定参数的 log2 的上限。这通常用于计算寻址给定大小的内存所需的最小宽度。
例如,如果设计有 7 个并行加法器,则表示所有 7 个加法器所需的最小位数为 $clog2
7 产生 3。
module des
#(parameter NUM_UNITS = 7)
// Use of this system function helps to reduce the
// number of input wires to this module
(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 有 3 位来存储总共 5 个单元。
模拟日志xcelium> run active_unit = 001 active_unit = 111 active_unit = 000 xmsim: *W,RNQUIE: Simulation is complete.
真正的数学函数
这些系统函数接受 real 参数并返回一个 real 号码。
函数 | 说明 |
---|---|
$ln(x) | 自然对数 log(x) |
$log10(x) | 十进制对数 log10(x) |
exp(x) | x 的指数 (e x ) 其中 e=2.718281828... |
sqrt(x) | x 的平方根 |
$pow(x, y) | x y |
$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(x x + y y ) |
$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; // convert 30 degrees to radians
$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.
Verilog