VHDL/Verilog-range语句中的数学运算是否被简化?

VHDL/Verilog-range语句中的数学运算是否被简化?,vhdl,verilog,system-verilog,Vhdl,Verilog,System Verilog,假设你有以下代码 signal a : std_logic_vector( N - 1 downto 0 ); 或者 N-1部分是否合成为实际逻辑,或者FPGA软件(如Quartus)是否在创建逻辑之前进行数学运算 示例用例,比如genericN表示所需位的数量。最好是使用一个通用的Nm1来保存减法运算,还是可以像上面那样使用N-1而不创建额外的逻辑来获取?在这两种情况下,N的值都必须在编译时计算。它不是,也不可能是逻辑生成的 请记住,任何HDL代码最终都必须能够合成为物理硬件。改变信号中的位

假设你有以下代码

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

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


示例用例,比如generic
N
表示所需位的数量。最好是使用一个通用的
Nm1
来保存减法运算,还是可以像上面那样使用
N-1
而不创建额外的逻辑来获取?

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


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

由于
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);

可由我所知的所有逻辑合成器合成,并且计算
写入字节\u启用\u宽度
不需要一个晶体管;它是在恒定传播阶段由合成器预先计算的。

为了澄清,如果我去RTL视图,我不应该看到在设计中使用了额外的加法器来进行
N-1
计算?N在编译时必须是一个常量(如@Dashwuff已经说过的)。N-1由您的合成工具计算!FPGA不会在任何加法器中计算该值!这只是描述(在逻辑向量的情况下)构建此电路设计需要多少硬件组件。注意:“任何HDL代码最终都必须能够合成为物理硬件”不是真的。HDL代码(VHDL和(系统)Verilog)也用于编写测试台和行为模型。在这种情况下,您可以做其他编程语言允许您做的任何事情,比如动态分配内存。
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);