VHDL / Verilog - 范围语句中的数学运算是否被狡猾化?

时间:2016-07-30 01:02:50

标签: vhdl verilog system-verilog

假设您有以下代码,

signal a : std_logic_vector( N - 1 downto 0 );

或者,

for i in 0 to N - 1
    ...

N-1部分是否被合成为实际逻辑,或者FPGA软件(例如Quartus)是否在创建逻辑之前进行了数学运算?

示例用例,通用N表示所需位数。有一个通用Nm1来保存减法是否更好,或者我可以通过使用N-1如上所述而不创建额外的逻辑?

2 个答案:

答案 0 :(得分:2)

由于N是通用参数,因此在合成时将其视为常量。正如我所知道的所有逻辑合成器一样,你的逻辑合成器会在推断任何硬件之前传播常量。合成器将在合成之前计算N-1表达式,此操作不会花费任何单个晶体管。对常量执行更复杂的操作也是一样的,比如调用函数。例如:

function log2_up(x: positive) return natural is
begin
    if x = 1 then 
        return 0;
    else
        return log2_up((x+1)/2) + 1;
    end if;
end function log2_up;
...
constant word_width: positive := 64;
constant write_byte_enable_width: positive := log2_up(64 / 8);

可由我所知的所有逻辑合成器合成,并且计算write_byte_enable_width不需要单个晶体管;它是在恒定传播阶段由合成器预先计算的。

答案 1 :(得分:1)

在这两种情况下,N的值必须在编译时计算。它不是 - 也不可能! - 在逻辑中生成。

请记住,任何HDL代码最终都必须能够合成到物理硬件。改变信号中的位数或改变某些逻辑被实例化的次数,不是可以用电子方式完成的。