数字IC笔试题(6)-乐鑫科技数字芯片2020
报价宝综合消息数字IC笔试题(6)-乐鑫科技数字芯片2020
前几天参加乐鑫的笔试,遇到一道题目,很有价值,分享给大家。
题目要求是将一个序列执行的C语言算法转化为单拍完成的并行可综合verilog。
C语言源代码如下:
算法C语言实现:
输出结果:
C语言作为参考模型,用于后续Verilog的功能模拟。
该算法逻辑如下,输入一个8bit的数,首先判断最高位是否为1,如果为1则左移一位,并且和8‘b00110001异或;如果最高位不为1则左移一位。此过程执行8次。
此时我们来看一下异或操作的真值表
我们可以看出:任何数与0异或都等于它本身,即0^x=x。所以我们可以把算法流程变换为:
‘h31 = ’b00110001, ’h00 = ’b00000000,设左移前最高位为M,可以将判断左移前最高位是否为1的过程省略,直接与 ‘b00MM000M异或,此时流程图可以简化为:
由此,我们可以将循环解开。
根据上述结果,可以用verilog描述。
testbench:
打印结果为:
loop2.v的实现和loop1.v类似,只是程式码量更少。
其实也可以将C语言函式封装成Verilog的function,然后在在单周期内进行赋值。
综上,loop1.v和loop2.v的主要贡献是解开了算法实现的if-else判断。至于loop3.v中将C语言描述的功能封装成fucntion,直接单周期完成赋值的实现方式在逻辑综合后是否增加了硬件开销不在本文讨论范围内。这和设计者施加的时序约束和综合工具算法有关。