复微杯参赛感悟与总结

感悟:

  从今年四月份确定参加数字赛道二做ECDSA,到我写下这篇总结的日期7月30日,差不多四个月时间。我们队伍从对于数字签名验签一窍不通的小白,到勉强用硬件实现ECDSA签名的小白,并且大家都是研究生,作为队长的我需要有导师的项目,而几个队友已经研二,需要去实习,准备简历。我们就在这忙碌中,变得更加忙碌了。所幸,报告还算完整,能够善始善终,大家也就如愿了。

首先介绍下我们人员配置,我们队伍决定设置3个设计和1个验证,其中我(博主)和佳哥作为主力设计,唐大佬负责辅助验证同学的对接人员,刘哥就负责验证工作。

四月份,我们每隔一周便开一次会议,前面两次会议讨论这个工作该怎么展开:

1)我提议所有设计都采用模块化的思维,先把签名验签用到的算法提炼出来,然后用盒子封住,只确定输入与输出。先搭建出一个总体系统框架,再去实现算法盒子的功能。

2)佳哥提出要把工作细化,对我们每个人都进行了详细的分工,每周都有一定的任务量,那段时间也是他每周都在催促我们的进度,让我们在最困难的时候保持继续前行。

大概到5月初,那时候我们对ECDSA算法已经算是知晓了其原理,并在一次会议中,我提出设计的时候能不能找到一个现成的工程作为参考,这样能加速我们的设计,腾出时间来做算法优化。于是我就在github上找到一个用Systemverilog写的ECDSA工程,它用quartus作为EDA工作,虽然工程由于hash部分不完整,导致工程无法编译,并且代码注释较少,但确实给我们提供了一个很好的参考。于是我们结合论文与这个工程,开始更细节的划分工作,我就主要做模运算和点运算模块;佳哥主要做签名和验签模块,并兼顾做模运算和点运算;唐大佬主要做hash模块,同时也辅助验证;刘哥就做模块化的验证工作。

到6月中旬,我们各自的工作都完成的差不多了,但是因为当时大家都很忙,我研一需要应付各种考试,他们研二需要去找实习。所以直到7月份,大家再开一次会,讨论各模块之间的互联。之前我就提到过的,让大家具备模块化的思维,然后我们在会议上统一了各自的接口,大家就先做好接口,准备互联工作。

7月份只有我比较闲一点,他们都去实习了,基本都是996下班回来在做下自己的工作。这个月中旬,我们完成了整个模块的互联,但是签名速率太慢了,在使用secp256K1曲线的条件下,签名一次都要近1秒钟,这就是传统方法的弊端。于是我和佳哥计划实现算法的优化,我对点乘模块进行了优化,采用滑动窗口法进行优化,使得点乘模块速率提升了好几倍。佳哥那边则是对模运算进行优化,采用了barrett约简,先计算结果再一次性模约简的方式稍微优化了大数模乘的运算速率。

最后几天,我们对其余部分进行完善,如总线模块和外部寄存器模块,并基于secp256k1曲线对每个模块进行了仿真,然后将整个工程让唐赟拿去综合,最后完成了这篇设计报告。

这次ECDSA最终我们还是没能做到500次/秒的签名速率,差不多时2ms完成一次签名。我们基于secp256k1曲线签名速率仅为17ms(100MHz时钟下),翻看仿真,发现还是标量乘用时太久了。因为目前采用的是窗口为2的标量乘算法,如果改用窗口数为3的窗口法,速率虽然能进一步提高,但是面积和功耗也会进一步提升。当然,我们的点加和倍点运算由于没有投影到仿射坐标下,导致标量乘的运算速率提升也会有限。有关综合方面,我们必须得承认在做设计时,没有专门去考虑怎么设计代码才能使电路面积较小,关键路径较小,这个也是有待后续去优化。

后面我们应该先针对底层的运算模块进行优化,再去优化上层的模块,这才是正确的道路。同时也是因为最开始的时候我们选择模块化的设计思想,如果要优化单一模块,那对整体的改动不会太大,这十分有利于我们后续开展算法优化的工作。

至于抗侧信道攻击和抗能量注入攻击,这两点,我们没有太多精力放在这上面,但是对于抗能量分析攻击我们做出了讨论,并提供了一个可行的算法方案,也算是对安全性有那么一点考虑了,后续如果因为佳哥想把这个方向当做他的毕业设计,而我想拿这个当做我的IC入门项目,我们会继续研究下去的。

 

结果:这次比赛并没有进入到决赛,很遗憾,那边评委导师给的评语如下:

  同学你好,我是复微杯主办方。现在将评委老师的评语发给你。本设计实现了素数域下的256位ECDSA功能,使用窗口法、欧几里得算法来提升性能。在方案选择上,该设计使用了仿射坐标系下的点加和倍点公式,其中存在大量模逆操作,是造成性能较慢的主要原因,设计中的点加和倍点实现方案和模乘的实现方案都还有进一步优化的空间。在报告的编写上,缺乏对某些关键模块设计方案的清晰描述,例如模乘单元。在验证方面,验证框图结构合理,reference给出了实现方法和golden data的种类。功能点比较全面,考虑到了异常case。数据的边界条件测试和异常情况测试可以考虑的更全面些。希望同学们在比赛过程中有所收获。

 

自己总结下原因:

1)签名验签最终在100MHz时钟下实现1次/17ms,没有达到要求的1次/2ms。这点是最底层的模运算没有做好优化。

2)博主作为队长,没有起到一个好的队长的身份,感觉参加了比赛,还是要以拿奖为目的。这次比赛中,前期我没有很好的去给大家分配任务,没有合适的去催促进度,所以前期大家做的都比较佛系。后期还有一两个月时间,大家都忙起来了,只能被迫加班加点搞了。

3)队伍自身问题,由于大家都是临时组建的队伍,恰逢博主研一刚接手导师的项目,队友都是研二都在忙实习找工作,佳哥也是每天晚上9点多回到寝室忙到凌晨一两点,第二天照常上班。佩服,佩服,等开学了必须线下找他约一波。

4)资料上传的过于简陋,只上传了整个工程的代码和主模块的testbeach及必须要求的设计报告,导致这部分评分可能很低。

5)分头设计,导致模块优化不是很顺利,我设计了模运算模块,但是却是佳哥去优化的;佳哥设计标量乘模块却是我来优化的,没有做好分工。

 

收获:

1)最大的收获就是几个一起奋斗过的队友了,这份经历值得珍惜。当然,明年我也等着他们给我内推,哈哈。

2)让我体会到了FPGA工程师和IC设计工程师直接的区别,比如做一个乘法器时,FPGA工程师直接调用IP或者直接一个*运算符就整上去了,但是IC设计工程师需要考虑面积,速率,一般采样进位加的方式做乘法运算。

3)让我后面有了第二个项目的奋斗目标吧,因为佳哥会把这个作为毕设,我打算也帮帮忙,对项目做进一步的优化,同时也学习IC验证与综合的东西。

 

  后面会陆续上传项目最初的项目版本,用于公共学习和交流。

 

posted @ 2021-08-17 17:12  jerry_cat  阅读(282)  评论(0编辑  收藏  举报