钟鼓楼

钟楼瘦,鼓楼胖

一、关于常量

1.1 负数

负数在 verilog 里是按照补码储存的,也就是说 2b1=11-2'b1 = 11,但是需要注意的是,在比较的时候,是无符号的比较,也就是说 2b1>2b0-2'b1 > 2'b0 这个事情是对的。更离谱的是,2b1==2d3-2'b1 == 2'd3 这件事也是对的,在表达式中运算的时候也是这样的。

1.2 参数

parameter 的提出我一开始以为他是多余的,因为 define 可以代替,后来这个跟 C 不一样,每次用 define 定义的宏,宏前面都是需要带 “ ' ” 符号的,所以写起来太不方便了。常见的还是用 parameter 比较方便,但是因为 define 还是有用的,因为 parameter 的右式必须是符合表达式规则的,但是 define 就没有这个要求。

Read more »

一、写在前面的话

这篇博文的本质不是一篇答案的汇总,HDLBits 的题目组织形式是蕴含思想的(就像五三或者衡中的数学卷子),可以看到,虽然大部分前面的题目都谈不上难,但是如果一道一道的做下来,就会有体会,网站的搭建者是希望通过这组题目,来传递一种硬件设计思想。当然,更谦虚的说法是硬件设计思想基础。这篇博文的目的就是通过这些题目,来勉力阐述这种思想。

我写到了 FSM 章节的一半,其他的都写了,短期内应该是肝不动了,所以 FSM 的后面的答案就没有题解了,实在抱歉。

鸣谢名单在结尾放出。因为是无聊的刷题故事(不是为了写这篇文章,我打死都不会写这组题),所以鸣谢人员中只有很少在解决问题上为我提供帮助,但是倒是有很多人陪伴见证了这个无聊的故事,故一并鸣谢。

这篇文章还算成点的东西:

Read more »

一、设计想法

1.1 我的 CPU 的整体架构

微信图片_20211123100405

1.2 从单周期到流水线

虽然学长一直在强调重构,身边大佬也都对重构乐此不疲。但是以我个人的感觉,感觉不太需要重构(这可能就是我 TLE 了两天的错误观念)。我个人感觉完全可以在单周期上面改。为了给大家一个直观印象,我从修改原单周期 CPU,流水线寄存器,加入阻塞刷新功能,加入转发功能方面分别说一下怎么改(严格说是怎么加,需要改的地方好像没有):

Read more »

一、代码规范

1.1 常量

我个人规范是将所有的常量都用伪指令.eqv 声明,其格式会在 3.2 中介绍。关键涉及一个问题,就是.eqv 这样定义的是一个立即数,但是不是所有的指令都可以重载了立即数参数模式,所以更加规范的规范是每次使用被.eqv 定义的常量之前,都加载立即数到一个寄存器(规定为 $t7),然后使用这个寄存器,这就是常量的全部规范。

当然,还有几种方法,一种就是把常量直接保存在寄存器中,每次就是用这个寄存器就好了。但是有两点缺陷,一个是寄存器资源会被占用,以 puzzle 为例,我们需要一个寄存器存 1,来做 bool 标记,需要一个寄存器存 4,来用于控制 dir 的四个方向,那么就被占用了两个寄存器。另一个是容易 bug,因为要时刻留心代码不修改规定寄存器。

还有一种是临到用的时候,在用 li 指令给某个寄存器一个值,但是这样也是容易造成寄存器混乱,还有一个缺陷是如果要修改常量的值,就会造成大量的修改工作。

Read more »

一、写在前面的话

首先,这道题目我并没有过,一共是应该六个左右的测试点,我最好的一次提交是还剩下 2 个测试点没有过,但是那次提交已经是属于脱离了规范,纯粹为了测试而写的,不是规范风格的代码。我在签退以后,虽然在群里面同学的帮助下(结尾有鸣谢名单),意识到自己代码存在的问题,但是新写好的代码也是没有经过评测机检验的。所以尽管我很想对大家负责,但是确实是客观条件不允许,我的代码要是运行出来 bug 了,请大家不要打我。

所以这篇文章,大家就看个乐呵就行了,要是真从其中咂吧出啥滋味来,那是诸位的功德,要是没有,也只是我的水平太低,与诸位无关。

我在文章里面只贴了一个 tb 模块的原码,主要是为了让大家看的明白一些,没有 cscore 的原码,跪求助教大大不要删帖。谢谢助教大大。


Read more »

It  is  all  about  control, cheat  and  tradeoff.It\space\space is\space\space all\space\space about\space\space control,\space cheat\space\space and\space\space tradeoff.

一、总论

1.1 关于需求

我认为,在 P7,我们设计的最终目的是实现一个看上去像单周期 CPU 的、具有反馈控制接口的流水线 CPU。如果再将目标细化一些,那么就是两个小目标,那就是:

  • 从外部(也就是软件程序开发者)看,流水线 CPU 被封装成了单周期 CPU
  • CPU 可以为外部提供反馈信息,并且可以让外部根据反馈信息进而更改 CPU 的运行状态(整个过程叫做反馈,实现了这个功能的 CPU 具有了软硬件交互接口
Read more »
0%