[21] 什么是竞争?什么时候会出现?如何避免?
当输出取决于不同信号的顺序或者时序时,被称为竞争。竞争可以分为两种
实际的硬件中的竞争 仿真行为中的竞争 实际硬件中的竞争:以SR锁存器为例,当SR都是1的时候,输出为1,此时如果SR同时变成0,那么Q和Q'就会进入竞争的情况。可以通过添加合适的逻辑避免。
仿真行为中的竞争:例如下面的代码
always @(posedge clk or posedge reset)
if (reset) X1 = 0; // reset
else X1 = X2;
always @(posedge clk or posedge reset)
if (reset) X2 = 1; // reset
else X2 = X1;
由于使用了阻塞赋值,便会发生竞争的情况,通过改为非阻塞赋值可以解决
[22] 用2:1mux实现D触发器 [23] 用D触发器实现T触发器 T触发器,T为0时输出不变,1时翻转。写出真值表就能看出来,将输入和Q异或再输入到D端。
[24] 用JK触发器实现D触发器 J=D,K=D'
[25] 行波进位加法器和超前进位加法器的区别是? 行波进位加法器:
结构类似于我们拿笔在纸上做加法的方法。从最低位开始做加法,将进位结果送到下一级做和。由于本级的求和需要等待前一级的进位结果才可以得到,所以对于两个N-bit的求和。即使有N个一位的全加器,也需要N个延迟。超前进位加法器:
事实上,在以下两种情况中,Ci=1:
Ai和Bi都为1 Ai和Bi有一个为1,且Ci-1为1 其对应的表达式为
递归后
可以看出每一级的进位信号可以不通过上一级的结果产生,只与输入有关系。因此减少了时间。
[26] 实现一个32bit寄存器需要几个flip-flop? 一个FF存储一bit信息,因此需要32个FF。
[27] mealy型FSM和moore型FSM有什么区别? mealy型FSM的输出和当前的状态以及当前的输入有关系。
moore型FSM的输出只和当前的状态有关系。
[28] 九个状态的记录最少需要几个FF? 2^3 < 9 < 2^4,因此是4个
[29] 使用尽可能少的DFF实现二分频和四分频 二分频:
四分频:
Computer Architecture [30] RISC和CISC的区别是什么? RSIC:精简指令集。CISC:复杂指令集 RISC结构具有比较少的指令,这些指令是简单的指令(固定长度的指令和较少的寻址模式)。CISC结构具有更多的指令,更加复杂,可变长度指令和更加多的寻址方式 RISC具有较小的指令,硬件上相对没有那么复杂。CISC使用更加复杂的硬件来解码和分解复杂的指令。因此RISC更加侧重软件,CSIC更加侧重硬件 CISC具有更加复杂的指令,因此可以使用更加少的RAM来存储编程指令。相对的,RISC需要更加多的RAM来存储指令 RISC的指令通常需要一个周期完成,而CISC可以能需要多个周期才能完成,具体取决于指令的复杂性。因此在RISC中可以进行流水线化。 RISC通过减少每条指令的周期数来提高性能,而CISC通过减少每条程序的指令数来提高性能。CISC支持单条指令完成从内存读取,执行操作,写回内存的操作(mem2mem操作)。而RISC完成则需要三个指令。 [31] 冯诺依曼结构和哈佛结构有什么区别? 冯诺依曼结构中,指令和数据存储在同一个存储器中。CPU读取数据和指令使用同一条总线,具有存储数据和指令的统一缓存。 哈佛结构中,数据和指令是分开存储的,可以使用两条不同的总线同时访问数据和指令,指令和数据都具有单独的缓存。 [32] 解释内存存储中的Little Endian 和 Big Endian的概念 字节顺序是指字节在内存中的存储顺序。数据在内存中通常是按照字节寻址的,但是大多数计算即通常采用32位(4个字节)存储操作数的。因此,为了将一个字节存在存储器中,由两种方式:
高字节存在低地址中,这称之为Big Endian 低字节存在低地址中,这称之为Little Endian 例如,当cpu向地址0x1000中写入0xDDCCBBAA时,两种方式就会出现差异
[33] SRAM和DRAM的区别是什么? DRAM:Dynamic Random Access Memory。动态随机存储,数据以电荷的形式存储,每个存储单元是由晶体管和电容组成的,数据存在电容中。DRAM是易失性设备,电容会因为漏电而流失电荷,所以需要定时刷新。
SRAM:Static Random Access Memory。静态随机存储,不需要属性,只需要电源即可,SRAM的存储单元由六个晶体管组成,因此与DRAM相比,占用面积更加多。
SRAM速度快,成本搞,常用于高速缓存。DRAM密度小,速度慢,常用于主存储器
[34] 对于256KB的内存,如果按字节寻址,需要多少位的地址线? 256KB=2^8*2^10Bytes,需要18位地址线
[35] CPU中不同类型的寄存器有什么区别? Program Counter (PC):保存当前正在执行的指令的地址 Instruction Register (IR):保存当前正在执行的指令的寄存器。(PC所指向的地址上的值) General Purpose Registers:通用寄存器是用于存储程序所需要的数据,通用寄存器的数量由体系结构定义,并可以由软件用于运行期间零是存储数据。 Stack Pointer Register (SP):堆栈指针寄存器用于存储压入队长的最新数据的地址。常见的用途是存储子函数调用时的返回地址。 [36] 解释计算机架构中的流水线 流水线技术是在单个处理器中实现指令集并行的技术。将基本的指令周期拆分为多个阶段,无需等待每条指令完成,并行执行不同的步骤,在一条指令结束之前开始下一条指令。流水线能投提高指令的吞吐率,但是并不能减小指令的指令时间。
[37] 什么是pipeline hazard?处理器中有几种pipeline hazard? pipeline hazard是指由于某些原因下一条指令无法执行的情况。有三种类型的hazard:
Structural Hazards:由于硬件资源不足产生的。比如如果设计结构中只有一个浮点执行单元,每次执行都需要两个周期的时间,那么当程序中出现背靠背的浮点指令时会导致流水线停止。除此之外内存和缓存的访问也会导致Structural Hazards Data Hazards:由于前后指令数据的依赖性而造成的hazard A、RAW:先读后写register,ture data dependence B、WAW:先写后写register,output data dependence C、WAR:先写后读register, anti-data dependence Control Hazards:当碰到跳转指令时,processor会stall一个cycle。因为processor在处理指令时会分两个stage:取指令和解码指令。当一条指令进入到解码阶段时,才会被发现需要跳转,所以在取指令阶段 的那条指令会被废掉,故浪费掉一个cycle。 [38] 如何避免三种pipeline hazard? Structural Hazards:将一个function unit切分成更小的stage或对设计相同功能的硬件等,总之,就是让硬件资源够用。 Data Hazards:A情况是真正的数据依赖,会产生hazard,可以用forwarding技术来减少或消除它;而B和C是在当指令顺序被compiler或者是硬件调整后才会出现的数据依赖。如果出现了B和C的情况,可以有一种技术来消除它,叫做register renaming。 Control Hazards:可以在program中加入likely()or unlikely()来帮助compiler预测taken or not taken的可能性。另外,compiler可以通过delayed-branch的技术来消除branch hazard,但是该技术很少用在很长的pipeline中。最后,可以通过硬件的技术消除Brach hazard。以上的技术都是compiler或hardware的技术,programmer可以不关心,但好的if语句应该 如下: if(unlikely(condition))
{
几率小
}
else
{
几率大
}
注意:将几率大的语句放在not taken下面,将几率小的语句放在taken下,这样会节省4个
cycle左右(由pipeline的深度决定)。另外,还有一种写法就是将unlikely改为likely,将几率大的和几率小的对调,这种方法比第一种方法要慢或持平(至于原因有compiler的原因,有pipeline的原因,所以它依赖于compiler和chip的设计)。
[39] 如果一个流水线由十个阶段,每个阶段需要1ns执行。假设没有hazards,那么处理100个数据需要多久? 第一个数据需要10ns完成,此后1ns完成一个数据的处理,因此总时间位10+99=109ns
[40] 指令有多少种寻址方式? 立即数寻址,操作数作为指令的一部分 add r0 r1 0x12 将r1+0x12的结果存在r1
直接寻址,操作数的地址直接出现在指令中 load r0 0x10000 将地址0x10000的数据存到r0中
寄存器寻址,操作数被存在寄存器中,寄存器的名字出现在指令中 mul r0, r1 , r2 将r1*r2的结果存在r0中
偏移量寻址,操作数的地址由一个寄存器的数据加上一个立即数的偏移量得到 load r0 r1 offset r1包含了及地址,r1+offset才是真实的地址