Engee 文档

HDL 和定点算术

Engee 中生成代码时,以及在计算环境和仿真中使用定点时,某些规则适用于算术运算。

C语言中的算术运算codegen icon 1 规则有许多隐式变换,数学运算的结果类型是根据符号和参数的等级推断出来的。

HDLverilog icon (硬件描述语言,如 Verilog、Chisel)中的算术运算规则很简洁,但由于参数宽度和定点的任意性而变得复杂。

规则:简明扼要

  • 如果所有参数类型均为无符号,则结果类型为无符号。否则,结果类型为有符号类型。

  • 类型宽度不限于 8/16/32/64 位,可以是 128 位(含 128 位)以下的任意自然数。

  • 选择结果类型时要确保不会发生溢出。

操作

结果类型

示例

加法

容纳全部可能结果值所需的最小类型

uint8 + uint8 = uint9,因为可能从高位进位。

乘法

结果类型的宽度是参数类型宽度之和,小数部分也是如此。

uint8 * uint8 = uint16

定点

除浮点数外,定点数也用于软件和硬件开发。定点数的灵活性不如浮点数,但定点数的运算速度通常更快。以下是定点数的基本概念。

目前,Engee 使用的是仅二进制点(二的幂次方)版本的定点数,而不是斜率偏置。
要了解如何在 Engee 计算环境中使用定点数,请参阅文章Engee 中的定点算术(固定点

二进制点

整数用二进制表示为 2 的幂和。例如,二进制的 9 是

从 MSB(最显著)到 LSB(最不显著)的位数

3

2

1

0

价值

1

0

0

1

两*位值的度

响应捐款

8

0

0

1

用二进制表示非整数时,可以在零位后加一个点,然后以 2 的负幂数开始计数。例如,`9.625`编码为

从 MSB(最显著位)到 LSB(最不显著位)的位数

3

2

1

0

-1

-2

-3

数值

1

0

0

1

1

0

1

两*位值的度

响应捐款

8

0

0

1

0.5

0

0.125

定义

  • 类型宽度(Type Width)是对类型值进行编码的位数。

  • 小数 "位的数量就是 "小数长度",也称为 "二进制点"(BP)。

  • 以十进制表示的值称为实际值(RWV)。

  • 如果从零开始从 LSB 到 MSB 对比特进行编号(即使是非整数实数值),得到的整数称为存储整数 SI。例如, 的存储整数是 9, 的存储整数是 77。

在这种情况下

此外,小数部分的长度可能是负数。在这种情况下,存储的整数要乘以小数部分长度的模数。因此,数字 112 只需使用三个比特和缩放 即可表示:

从 MSB(最显著)到 LSB(最不显著)的位数

6

5

4

数值

1

1

1

两*位值的度

对答案的贡献

64

32

16

还要注意,小数部分的长度可以超过类型的宽度。例如, 可以用字宽 3 和 BP 11 表示,即

从 MSB(最有效)到 LSB(最小有效)的位数

-9

-10

-11

数值

0

1

0

两 * 位值的度

对响应的贡献

0

0.0009765625

0

代号

根据Engee 中的定点算术 一文,我们将最一般的形式表示为 fixdt(S,W,f)。此处:

  • S - 0 表示无符号类型,1 表示有符号类型;

  • W - 类型的宽度;

  • f - 小数部分的长度 (BP)。

具体类型名称举例:

名称 含义

uint32

宽度为 32 位的无符号整数类型

`uint123

宽度为 123 的无符号整数类型

sint16

宽度为 16 的有符号整数类型

符号定点类型

带符号定点类型,宽度(总长度)32,小数部分长度 5

ufix32_En5 未符号定点类型,宽度为 32,小数部分长度为 5。

无符号定点类型,宽度为 32,小数部分长度为 5

`ufix3_E4

无符号定点类型,宽度 3,小数部分长度 -4

从算术角度看,以下类型是等价的:uint42`、ufix42ufix42_En0ufix42_E0

精确度

仅在最小有效位不同的数之间的差称为精度。精度取决于小数部分的长度,如下所示:

例如,ufix8_En3 可以表示精度为 0.125 的数字,1.0625 将四舍五入为 1.125,1.0624 将四舍五入为 1.0。而 ufix8_E3 则表示精确到 8 的数字。

斜率偏差

定点数的另一种(更灵活但性能较差)变体是斜率偏置表示法,在这种表示法中,数字编码为



仅二进制点是斜率偏置的一种特例,其中

算术

运算前,先对参数的二进制点进行对齐,然后对参数进行相加/相乘运算。例如,要将 ufix4_En3 中的 ufix2_En1 中的 相加,必须先在第二个数字的虚数点后面加上两个 0:

  1001 (ufix4_En3)
+   01 (ufix2_En1)
= 1.001
+ 0.100
= 1.101

的分数长度为 3,就是

规则:详细

操作 参数 1 类型 参数 2 类型 结果类型

加法

fixdt(S1, W1, f1).

fixdt(S2,W2,f2)`。

所需的最小类型,在简单情况下可容纳结果的全部可能值
fixdt(S1 或 S2, max{W1, W2} + 1, max{f1, f2}).

乘法

fixdt(S1, W1, f1)

fixdt(S2, W2, f2)

fixdt(S1 或 S2, W1 + W2, f1 + f2).

加法

宽度的选择是为了适应参数加法结果的可能取值范围。

*算法

  1. 找出操作数相加后可能得到的最小值和最大值。

  2. 找出存储结果范围所需的最小位数。


  • 示例

  • 添加两个 sfix5_En2 将产生 sfix6_En2,因为我们需要将结果类型扩展一位,以节省高位的可能进位。添加 ufix8_En1ufix8_En3 会产生 ufix11_En3

      1111111.1
    + 11111.111
    =  1111111.100
    +  0011111.111
    = 11011111.001

    由于位宽 .

  • 其他示例:

参数类型 1 参数类型2 结果类型

sfix5_En2

`sfix5_En2

`sfix6_En2

sfix18_En5.

sfix16_En6.

sfix20_En6.

ufix5_En17.

`ufix32_E2

ufix51_En17.

ufix4_En7 ufix5_E2 ufix51_En17.

`ufix5_E2

ufix14_En7.

`ufix4_En7

`ufix5_E2

ufix15_En7.

`ufix4_En7

`fix14_E2

fix24_En7

`ufix4_En7

`fix14_En2``修复

sfix20_En7.

修复 4_En38

`sfix6_E78``fix123_E78

sfix123_En38.

多个数字之和

对于多个参数,累加器的最小宽度是同时计算所有参数的,而不是按顺序先计算前两个参数,然后再计算前一个结果与第三个参数的相加,以此类推。同时考虑所有参数类型的计算,可以节省保存结果所需的宽度。

向量元素之和

对于程序块Sum(输入矢量元素的求和,Add 程序块的特殊模式),我们进行了优化,以避免循环计算(如在 Add 中发生的情况),并快速确定结果的类型。也就是说,由于所有元素的类型都是相同的 "fixdt(S, W, f)",因此可以观察到:



同样,先确定结果的最小值,然后选择所需的类型宽度。

可以估计

乘法

推断乘法运算结果类型的规则已在本节的表格中作了充分说明。 规则:详细,并通过归纳法和关联法扩展到任何数量的参数。没有任何例外或额外的复杂性。