HLS第三十一课(C编程和C描述的区别)

C语言本来是用于编程的,描述的代码,被CPU的编译器所理解,并转换成在时间线上向前推进的指令序列。
C语言编程时,主要需要定义清楚的,主要是三个方面。
一个是数据的内存分布,一个是对数据内存的操作序列。第三个,也是最宏观的,是基于数据交接的任务划分。
这里所说的数据内存,除了包括RAMMemory,也包括IORegionMemory。
这两个方面,一个体现为变量实例化,对象实例化,这涉及到内存分配给变量或者对象。
另一个体现为函数内的结构化语句,例如结构化语句块的入口条件判断,结构化语句块的表达式执行语句等。
第三个,体现为函数间的层次调用。函数调用的核心,就是数据交接。
调用者向被调用者交接输入的参数,而被调用者向调用者交接输出的结果。
调用者无需关心被调用者如何执行,何时执行完毕,调用者只需要关心,交接哪些输入参数,哪些输出结果。
被调用者无需关心被谁调用,何时被调用,被调用者只需要关心,交接哪些输入参数,哪些输出结果。

+++++++++++++++++++++++++++++++++++++++++++++
HLS中,借用了C语言作为工具,是用来作为HDL使用的,这时,C语言并不是编程的,而是描述硬件的。
在HLS中,
C语言描述的数据内存分布,结合pragma,被HLS理解为bram或者register或者FIFO。
C语言描述的操作序列,结合pragma,被HLS理解为多个操作符处理器硬件,表达式中对数据的取用,被HLS理解为read bus,表达式中对变量的赋值,被HLS理解为write bus。
C语言描述的形参,结合pragma,一方面,被HLS理解为数据存储单元,(如前说述的BRAM或者register),另一方面,被HLS衍生出port。
C语言描述的函数划分,结合pragma,被HLS理解为模块,以及层次实例化。

由于涉及到思维转换,这里面有一些令人费解的概念,下面一一描述。
+++++++++++++++++++++++++++++++++++++++++++++
interface与variable
HLS 中,对于形参,可以施加interface约束,而约束的目标是port,
对于形参,还可以施加resource约束,而约束的目标是variable。
这如何理解?

对于形参,一定要有一个概念,首先,它是一个variable,然后,由于它是顶层形参,所以,它可以衍生出port,注意,是衍生。
所以,interface约束的,实际上是如何从外界获取数据给variable的对应坐标的硬件信号形式。
我们可以想象,interface类似于一个协议转换器,一端是external port,另一端,是internal buffer,这个协议转换器,会将port上的数据,转存到buffer中的合适位置,同时,会记录下各种需要的状态信号,供FSM使用。

如果是memory类型,那么HLS中C描述和常规的C描述,所理解的是一致的。
对形参的读操作或者写操作,都是对RAM buffer的读写访问。

如果是stream类型或者fifo类型,那么HLS中C描述和常规的C描述,所理解的就有区别。
首先,最重要的一点,常规的C描述,是无法理解FIFO这种形式的存储器的。
注意,常规C描述,只能理解RAM这唯一的形式的存储器。

将一个variable约束为stream,HLS是如何做到正确理解设计意图的?
首先,从硬件的角度来看,FIFO有一个读端口,一个写端口。
这就要求HLS的C描述中,在一个结构化语句块中,只会写一个variable,且地址单调递增,而在另一个结构化语句块中,只会读一个variable,且地址单调递增。
更典型的,发生在子函数调用之间,上游调用模块只写一个object,且地址单调递增,而后级调用模块只读一个object,且地址单调递增。

对于形参变量,类似的,通过interface协议转换器,将数据输入到了形参变量的buffer的合适位置,FSM单调递增地取用数据,且只能取用一次,无法第二次取用。
如果是输出,则FSM单调递增地将数据写入形参变量的buffer,interface协议转换器,将buffer中的数据,依次取出,并打出到port上,且只能打出依次,无法第二次打出。

当FSM对一个streamlized variable发起读请求时,它仍然是发出读地址,但是这个读地址被传给一个read bridge,这个read bridge会判断读地址是否合法,如果合法,则会读出一个buffer中的数据,并将下一个合法地址递增。
类似的,当FSM对一个streamlized variable发起写请求时,它仍然是发出写地址,但是这个写地址被传给一个write bridge,这个write bridge会判断写地址是否合法,如果合法,则会写入一个buffer数据,并将下一个合法地址递增。

再从软件的角度,来看这个streamlize的问题。
我们可以想象,当一个variable被约束为stream时,它就仍然被分配了足够大的内存空间地址,除了对软件代码风格提出了一些特殊要求,其他并无差异。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值