HLS中使用浮點數(shù)
學習目標:
- 使用浮點數(shù)
- 換用自己的庫進行高級綜合
HLS中的浮點數(shù)
stratus HLS提供內(nèi)置的浮點數(shù)村斟,可以實現(xiàn)常規(guī)的加減乘操作昔汉,類型為:
cynw_cm_float<e,f,accurcy,rounding mode,NaN handle>
該類型共有5個模板參數(shù)丢胚,分別如下所示:
- e:指數(shù)位寬,為浮點數(shù)的指數(shù)位數(shù)
- f:尾數(shù)位寬倦蚪,為浮點數(shù)的尾數(shù)位數(shù)
- accuracy:精確度碉碉,這一參數(shù)可以設(shè)置是否需要實現(xiàn)完整的IEEE標準浮點數(shù)殴穴。若需要實現(xiàn)則可以提高計算精度凉夯,若不實現(xiàn)則可以縮小面積提升性能。
- rounding mode:取整模式采幌,推測為浮點數(shù)尾數(shù)處理中如何取整劲够,具有多種模式
- NaN handle:用于選擇如何處理NaN
對于指數(shù)位寬和尾數(shù)位寬,為每一個浮點數(shù)都具有的參數(shù)休傍,不用過多解釋征绎;對于精確度,具有多種選項,每種選項具有不同的精度-代價折中人柿,如下表所示:
標號 | 說明 |
---|---|
CYNW_REDUCED_ACCURACY | 默認情況柴墩,使用低精度低代價實現(xiàn)方法 |
CYNW_BEST_ACCURACY | 使用IEEE標準的浮點數(shù) |
CYNW_NATIVE_ACCURACY | 使用C++中的浮點數(shù),不可綜合 |
CYNW_EXCEPTION_ACCURACY | 使用IEEE標準帶異常的浮點數(shù)精度 |
對于取整模式rounding凫岖,可選擇的如下表所示:
標號 | 說明 |
---|---|
CYNW_NEAREST | 默認情況江咳,向最接近的偶數(shù)取整 |
CYNW_POSINF | 向上取整 |
CYNW_NEGINF | 向下取整 |
CYNW_RNDZERO | 向零取整 |
CYNW_NEAREST_AWAY | 四舍五入 |
對于NaN處理,有下表所示:
標號 | 說明 |
---|---|
0 | 返回恒定的NaN |
1 | 默認情況哥放,標準IEEE的NaN處理方法歼指,左操作數(shù)優(yōu)先 |
2 | 標準IEEE的NaN處理方法,右操作數(shù)優(yōu)先 |
使用方法
在設(shè)計中甥雕,需要添加頭文件cynw_cm_float.h
即可使用以上浮點數(shù)類型踩身,使用時如同常規(guī)數(shù)據(jù)類型直接使用,可實現(xiàn)加減乘等操作社露,如下所示:
#include "cynw_cm_float.h"
typedef cynw_cm_float<5,10> DT;
// DT a,b,c;c = a+b 可實現(xiàn)
在project.tcl
中挟阻,需要在添加庫的同時添加使用浮點庫,如下所示:
use_hls_lib "cynw_cm_float"
隨后進行常規(guī)的仿真流程即可呵哨,下圖為CYNW_REDUCED_ACCURACY的float16加法器的仿真和綜合結(jié)果赁濒,使用的庫是自帶的55nm庫:
時序相關(guān)
時序設(shè)置
對于時序而言,在HLS有多個參數(shù)可以設(shè)置孟害,包括:
- 時鐘頻率(必須)
- 時鐘非理想因素
- 輸入與輸出延遲
這些因素在常規(guī)流程中使用SDC進行設(shè)置拒炎,在HLS流程中在代碼或project.tcl
中設(shè)置。首先考慮時鐘非理想因素挨务。即uncertainty击你,在HLS中使用cycle_slack
在project.tcl
中設(shè)置,如下所示:
set_attr clock_period 10.0
set_attr cycle_slack 1.5
上述設(shè)置時鐘周期為10ns谎柄,非理想因素為1.5ns丁侄,等效時鐘周期為8.5ns。輸入與輸出延遲在代碼中直接設(shè)置朝巫,使用HLS_SET_INPUT_DELAY
或HLS_SET_DEFAULT_INPUT_DELAY
設(shè)置輸入延遲鸿摇,其中:
-
HLS_SET_INPUT_DELAY( port, float delay, "char* name" )
:用于設(shè)置特定端口 -
HLS_SET_DEFAULT_INPUT_DELAY( float delay, "char* name" );
:用于設(shè)置所有未被特定設(shè)置的端口
對于輸出而言,同理有:
-
HLS_SET_OUTPUT_DELAY(signal_id, delay );
:用于設(shè)置特定端口 -
HLS_SET_DEFAULT_OUTPUT_DELAY( delay);
:用于設(shè)置所有未被特定設(shè)置的端口
stratus HLS一般使用寄存器輸出劈猿,因此除非輸出端口拙吉,輸出延遲可以不進行設(shè)置。設(shè)置端口延遲如下所示揪荣,以下例子中筷黔,設(shè)置了w_in端口的輸入延遲為0.5ns,其他端口(x_in和data_valid)均為0.3ns仗颈。
void dut_template::t() {
HLS_SET_INPUT_DELAY(w_in,0.5,"data0_delay");
HLS_SET_DEFAULT_INPUT_DELAY(0.3,"data1_delay");
{
HLS_DEFINE_PROTOCOL("reset");
w_in.reset();
x_in.reset();
y_out.reset();
data_valid.write(0);
wait();
}
while(1) {
HLS_PIPELINE_LOOP(SOFT_STALL, 1, "main_loop");
DT x_val = x_in.get();
DT w_val = w_in.get();
DT out_val = x_val + w_val;
y_out.put(out_val);
}
}
時序違例
HLS一般不會出現(xiàn)時序違例佛舱,因為可以自動進行流水線的插入操作,經(jīng)過試驗,即使float計算ip也可以在時序不滿足時自動進行流水線插入以避免時序違例请祖,同時stratus HLS將時序違例看做“錯誤”订歪,當出現(xiàn)時序違例時,軟件會拋出錯誤Error并打印時序違例的信息损拢,一般時序違例來源于人工指定過多時序等陌粹,例如強制要求某段代碼在指定的時鐘周期內(nèi)完成。
使用自己的庫
stratus HLS中內(nèi)置一個55nm的庫福压,在具體工藝中掏秩,需要使用自己的庫進行評估,在project.tcl
中荆姆,使用如下命令:
use_tech_lib "path.lib"
注意需要使用的是.lib庫而不是.db庫蒙幻。隨后重新生成makefile,即可使用自己的庫進行評估胆筒。