Verilog имеет функции для натурального логарифма ($ln()
), десятичного логарифма ($log10()
) и потолка двоичного логарифма ($clog2()
).В постоянных выражениях они должны быть синтезируемыми, но фактическая поддержка инструментами может быть разной.
Ниже приводится синтезируемый код Verilog:
module test(output [31:0] a, b, c);
assign a = 1000 * $ln(123);
assign b = 1000 * $log10(123);
assign c = 1000 * $clog2(123);
endmodule
Например, после синтеза RTL с Yosys (например, yosys -p 'prep; write_verilog -noattr' test.v
):
module test(a, b, c);
output [31:0] a;
output [31:0] b;
output [31:0] c;
assign a = 32'd4812;
assign b = 32'd2090;
assign c = 32'd7000;
endmodule