芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 |
---|
四社区联合力荐!近500篇数字IC精品文章收录! |
【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 |
笔试
1、 用verilog描述一个debounce逻辑。
//Debounce是一个防抖函数,相当于硬件电路中的按键开关所做的防抖。
module debounce(
input clk
input nrst
input press
output press_value
output press_flag);
reg [3:0] cnt;
reg press_reg;
always@(posedge clk or negedge nrst)
if(!nrst)
begin
cnt<='d0;
press_reg<='d1;
end
else if(press_reg!=press && cnt<4'b1111)
cnt <= cnt + 1'b1;
else if (cnt == 4'b1111)
cnt<= 'd0;
else
press_reg<=press;
assign press_value = (cnt == 4'b1111)?press:0;
endmodule
2.下图为符合某一特征多项式的移位寄存器链,用verilog写出输出信号逻辑(中间信号名可自定义)
module LFSR(
input data_in,
input clk,
input nrst,
input [7:0] seed;
output data_out);
reg [7:0] lsb;
reg out
always@(posedge clk or negedge nrst)
if(!nrst)
lsb <= seed;
else
data_out <= lsb[7] ^data_in;
lsb[0] <= lsb[7] ^data_in;
lsb[1] <= lsb[7] ^data_in ^lsb[0];
lsb[2] <= lsb[7] ^data_in ^lsb[1]
lsb[3] <=lsb[2];
lsb[4] <=lsb[3];
lsb[5] <=lsb[4]^lsb[7] ^data_in;
lsb[6] <=lsb[5];
lsb[7] <=lsb[6]^lsb[7] ^data_in;
endmodule
3.用verilog实现一个2.5分频电路
module (
input clk_in,
input nrst,
output clk_out);
reg clk_p, clk_n;
always@(posedge clk or negedge nrst)
if(!nrst)
clk_p <= 1'b0;
else
clk_p <= ~clk_p;
always@(nesedge clk or negedge nrst)
if(!nrst)
clk_n <= 1'b0;
else
clk_n <= ~clk_n;
assign clk_out = clk_n & clk_p;
endmodule
4、 如何实现一个数字2倍频电路(思路即可)
一个同或门与一个时钟上升沿有效的D触发器(连接成翻转器)组成,同或门的输入为D触发器输出的非和clk_in,同或门的输出为clk_out;
5.画一个状态机用来检测串行输入的101011序列
6.怎么解决芯片STA分析中出现的setup violation和hold violation
Set up violation 减少寄存器中间的组合逻辑电路的数量,重定时或做成流水线(加寄存器),使用更先进set up time小的工艺库等
Hold violation 加buffer
7.设计一个多时钟切换模块,需要注意哪些方面
时钟切换过程中可能会产生毛刺,
时钟切换前后的频率
Clock切换前后的clock jetter/时钟质量
等等
8.一个1bit信号A和一个10bit信号B,在跨时钟域传输处理上有何异同
单bit信号按照时钟域快慢切换的不同,慢到快可以打两拍,快到慢可以采用电平同步器和脉冲同步器的设计方法
多bit不能采用简单的打两拍,需要采用如异步FIFO,握手信号等方法做跨时钟域
9. 用verilog实现两个8bit有符号数A,B的求和运算,并保证最后的和在-64~63之间//默认有符号数AB的输入形式是原码
module signed_add (
input [7:0] A,
input [7:0] B,
output [8:0] C);
wire [7:0] complement_A;
wire [7:0] complement_B;
wire [8:0] complement_C;
//求AB的补码
assign complement_A = A[7]? {A[7],~A[6:0]}+1'b1: A ;
assign complement_B = B[7]? {B[7],~B[6:0]}+1'b1: B ;
assign complement_C = complement_A + complement_B;
assign C = ($signed(complement_C)>(-64) && $signed(complement_C)<(63) ) ? complement_C[7:0] :0 ;
//输出的C也是补码形式,不同工具对补码的表示不一定都支持,有需要再换成原码即可
endmodule
10.设计一个8bit输入的mod 3运算模块(实现思路即可)
mod3运算:除三的余数
使用状态机,除以三的余数的可能性为0,1,2,一共三种状态
8bit输入放在寄存器中
再使用一个从零开始的计数器,每个时钟上升沿自增1,直到和8bit输入相等
在这个过程中,0-1-2-0-1-2,三种状态循环改变
最后相等的时候对应输出所在状态代表的余数即可
一面
聊天,应该没啥培养体系,进来就干活,一对一带教
复试
一个串并转换模块的验证testbench搭建和verificationspec的报告