Engee 文档

Hdl和定点运算

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

规则 c中的算术 codegen icon 1 拥有一套 隐式转换,而数学运算的结果类型是根据符号和 参数排名

HDL中的算术运算规则 verilog icon (硬件描述语言,例如Verilog,Chisel)简洁,但由于参数的任意宽度以及固定点而变得复杂。

规则:简短和文字

  • 如果所有类型的参数都是无符号的,则结果类型是无符号的。 否则,结果类型为标志性的。

  • 类型宽度不限于8/16/32/64位,而是可以是直至并包括128的任何自然数。

  • 选择结果类型,以便没有溢出。

运作

结果类型

例子:

此外

可容纳整个可能结果值范围的最小所需类型

uint8 + uint8 = uint9,因为可能有从高级类别转移

乘法运算

结果类型的宽度是参数类型宽度的总和,与小数部分相同。

uint8 * uint8 = uint16

定点

与浮点数一起,在软件和硬件开发中使用定点数。 它们不如浮点数灵活,但具有定点数的操作通常更快。 下面介绍了定点数的基本概念。

*Engee*目前使用的是定点数的二进制点(power-of-two)变体,而不是斜率偏差。
阅读文章中有关在*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

定义

  • 类型宽度是编码类型值的位数。

  • "分数"位的数目是分数部分的长度(Fraction Length),它也将被指定为二进制点(BP)。

  • 十进制的值称为真实世界值(RWV)。

  • 如果位从LSB编号到MSB,从零开始(即使对于非整数实值),将获得的整数表示为存储整数SI。 例如,存储整数 -这是9,并为 — 77.

在这种情况下,执行以下操作 .

而且,小数部分的长度可以是负的。 在这种情况下,存储的整数乘以小数部分长度的模数。 因此,数字112可以仅使用三个位和缩放来表示。 :

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

6

5

4

意义

1

1

1

二*位值的功率

对回应的贡献

64

32

16

另请注意,小数部分的长度可能超过类型的宽度。 例如, 它可以在宽度3和BP11的类型中表示为 :

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

-9

-10

-11

意义

0

1

0

二*位值的功率

对回应的贡献

0

0.0009765625

0

负数编码为 二的补语(二的补语)。

指定名称

最一般的形式表示为 fixdt(S,W,f) 根据文章 Engee中的定点算术。 这里:

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

  • W -类型宽度;

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

特定名称类型的示例:

指定;指定 意义

uint32

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

uint123

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

第16条

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

sfix32_En5

定点字符类型,宽度(总长度)32,小数长度5

ufix32_En5

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

ufix3_E4

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

从算术的角度来看,以下类型是等价的: uint42, ufix42, ufix42_En0, ufix42_E0.

准确度

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

例如, ufix8_En3 它可以表示高达0.125的数字,1.0625将向上取整为1.125,1.0624将向上取整为1.0。 A ufix8_E3 表示最多为8的数字。

斜率偏差

定点数的另一种(更灵活,但性能更低)版本是斜率偏差表示,其中数字编码为:



仅二进制点是斜率偏置的一个特殊情况,其中 , .

算术

在操作之前,将自变量的二进制点对齐,然后将自变量相加/相乘。 例如,对于添加 ufix4_En3 ufix2_En1 您必须首先在第二个数字中的虚点之后添加两个零。:

  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,最大{W1, W2} +1,最大{f1, f2})

乘法运算

fixdt(S1,W1,f1)

fixdt(S2,W2,f2)

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

此外

选择宽度以适应添加参数结果的可能值范围。

算法:

  1. 我们找到通过添加操作数可以获得的最小可能和最大可能值。

    1. 要计算结果的最小可能值,请添加参数类型的最小值(无符号数为0和 х 为标志性人物)。

    2. 为了计算结果的最大可能值,我们添加参数类型的最大值。

  2. 我们找到保留结果范围所需的最小位数。


例子:

  • 当添加两个 sfix5_En2 它会奏效的 sfix6_En2,因为我们需要将结果类型扩展一位,以便从某处的最高位保存可能的传输。 加起来时 ufix8_En1ufix8_En3 它会奏效的 ufix11_En3:

      1111111.1
    + 11111.111
    =  1111111.100
    +  0011111.111
    = 11011111.001

    由于bit_width .

其他例子:

论证类型1 论证类型2 结果类型

sfix5_En2

sfix5_En2

sfix6_En2

sfix18_En5

sfix16_En6

sfix20_En6

ufix5_En17

ufix32_E2

ufix51_En17

ufix4_En7

ufix5_E2

ufix14_En7

ufix4_En7

sfix5_E2

sfix15_En7

ufix4_En7

sfix14_E2

sfix24_En7

ufix4_En7

sfix14_En2

sfix20_En7

sfix4_En38

sfix6_E78

sfix123_En38

数的总和

对于多个参数,一次为所有参数找到累加器的最小可能宽度,而不是顺序首先为前两个参数,然后为添加前一个结果和第三个参数等。 在同一时间考虑所有参数的类型的计算允许您保存保存结果所需的宽度。

向量元素之和

对于块 Sum(传入向量元素的求和,*Add*块的特殊模式)优化应用于避免循环中的计算(如*Add*中发生的那样),并且快速确定结果的类型。 也就是说,由于所有元素的类型都是相同的 fixdt(S,W,f),可以注意到:



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

可以估计 .

乘法运算

推断乘法结果类型的规则在规则:详细部分的表格中有充分的描述,并通过归纳和关联性应用于任意数量的参数。 没有例外或任何额外的困难。