c代码定点化过程中拿到一个函数如何去分析

Python019

c代码定点化过程中拿到一个函数如何去分析,第1张

分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。下面以一个实例演示该方法的应用。实例:编写函数求3个数中的最大值与最小值。方法:把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下:#include "stdio.h"#include "conio.h" int max,min/*定义两个全局变量用于保存函数返回值*/ void max_min(int a,int b,int c) /*定义求最大最小值的函数*/ {max=min=a/*初始化最大最小值*/ if(max if(max if(min>b)min=b if(min>c)min=c }main() {int x,y,z printf(" 请输入3个整数:\n") scanf("%d,%d,%d",x,y,z) max_min(x,y,z) /*调用求最大值与最小值的函数*/printf("三个数中的最大值为:%d最小值为:%d",max,min)/*输出最大值与最小值*/getch() }

在SoC设计流程中,开发一个功能模块需要首先设计算法,通常使用matlab或python等高级语言开发。对于任意一组输入数据,高级算法模型会给出一组输出数据。当输出数据的效果符合业务要求后,高级算法的方案可以固化定性,下一步需要将高级算法模型改造成适合电路行为的定点化C语言算法模型,称为C Model。

芯片团队中负责IP设计的某个小团队需要将已经定点化的C Model翻译成芯片设计软件能够识别的RTL代码,然后用EDA工具将RTL代码编译成门电路网络,交给后端团队进行物理设计和布局布线设计。

bit-true的意思是说,定点化C model 翻译成RTL代码之后,RTL 系统的输入输出行为与C model的输入输出行为是100%匹配的,没有任何一个bit是错误的。如果海量的测试数据都能够做到bit-true,我们就有足够的信心相信,IP团队提交的RTL设计是正确的,是最初算法的一个等价系统。

在芯片中,数字电路都是在某个时钟的驱动下工作的,而时钟的基本单位是拍(cycle),由于时钟信号的触发,每个cycle电路的状态会翻转一次,某些寄存器从0翻转到1,另外一些寄存器从1翻转到0,剩下的寄存器就保持原值不动。

cycle true的意思是说,不仅RTL的输入输出行为与C model是严格一致的,而且RTL 系统内,所有关键变量、关键状态的翻转行为也是和C model 严格一致的。每一拍有哪些状态发生了翻转,翻转成什么状态,都和C model 的设计意图完全一致。

能够支持cycle true 的C model 开发起来非常困难,因为要求更复杂,设计细节特别多,非常难以达到。但是对于最复杂的电路系统,比如CPU、DSP,开发cycle true的软件模型是十分必要的。

用FPGA实现算法,简单理解就像用C语言实现算法一样。不过FPGA用硬件描述语言,如verilog

等。可以根据算法先用C实现,然后再用verilog实现。C和verilog有种一一对应的关系。综合之后有需要可以进行布局,约束和优化等。因为FPGA可以并行执行,所以实现算法要比CPU类型的器件(如DSP、MCU等)有优势。