IC笔试题
作者:互联网
单选题(每题2分 共20题)
1.状态机的编码风格包括一段式、两段式和三段式,下列描述正确的是( )
A一段式寄存器输出,易产生毛刺,不利于时序约束;
B二段式组合逻辑输出,不产生毛刺,有利于时序约束;
C三段式寄存器输出,不产生毛刺,有利于时序约束;
D所有描述风格都是寄存器输出,易产生毛刺,有利于时序约束。
一段式和三段式都是寄存器输出,不产生毛刺。二段式会有毛刺可能。
2.线网中的值被解释为无符号数。在连续赋值语句中,assign addr[3:0]=-3;addr被赋予的值是( )
A 4'b1101
B 4' b0011
C 4' bxx11
D 4' bzz11
负数补码表示然后赋值。
3. "a=4' b11001,b=4' bx110" 选出正确的运算结果( )
A a&b=0
B a&&b= 1
C b&a=x
D b&a=x
a & b = x000 注意或运算的时候 如果是 1|x 那么结果是1
4.下列描述代码可综合的是( )
A fork... join
B assign/deassign
C if ... else和case
D repeat和forever
5. reg[255:0] mem[7:0]正确的赋值是( )
A mem[5]==3' d0;
B mem[10]=8' d1;
C mem=0;
D mem[5][3:0]
=4' d1;
题目有点表述不准确,verilog 1995标准里面只有A对(上标和下标不能引用),在2001标准里面D也对,取消了这个限制
6.以下关于逻辑综合中解决congestion问题描述不正确的是( )
A禁用多引脚标准单元,例如4输入引脚以上的标准单元
B使用partial blockage以降低congestion区域的cell density
C过多使用MUX单元不利于congestion的优化,因此MUX单元要尽可能禁用
D尽可能使用DCG做逻辑综合
-
congestion:拥塞、空间内可布线的程度、绕线
-
A对,High Pin Density Congestion就是因为引脚数量过多导致net十分密集
-
DCG:DC graphical,基于解决布线拥堵问题的DC模式
7.综合不包括下面哪一个过程( )
A Translation
B Routing
C Mapping
D Logic Optimization
三个流程,translation,mapping,optimization
8.下面关于FIFO的描述正确的是
A FIFO的读写必须属于同一时钟域
B FIFO是先进先出的存储器
C外部不可以直接操作FIFO的读写地址
D FIFO的空信号在写时钟域产生,满信号在读时钟域产生
B这个选项有点刁钻?FIFO是缓存器不是存储器?C肯定是对的。
9. Verilog语言中,下列哪些语句不可以被综合( )
A generate语句块
B for语句块
C function语句块
D force语句
10. 下面表达式中结果位1' b1的是( )
A 4' b1010&4' b1101
B !4' b1001 || !4' b0000
C &4' b1101
D ~4' b1100
简答题
11.简述流水线设计的方法和作用。
流水线的设计方法:将原本一个时钟周期完成的较大的组合逻辑通过合理的插入寄存器后分割成多个时钟周期来完成,即前一级流水线的输出是下一级流水线的输入。
作用:
- 对长功能路径的合理划分,在同一时间内并行多个功能请求,提升吞吐率
- 长路径被切分为短路径,可以达到更高的工作频率
12.怎样用D触发器、与或非组成二分频电路?
一个D触发器+非门
13.请根据下面的设计描述,尽可能多的列出你所能想到的用于功能验证的测试点
一个异步FIFO, rdata和wdata均为8位数据,FIFO深度为16,当rst_n输入为低时,FIFO被复位,当wclk的上升沿采样到wr为高时,数据被写入FIFO,当rclk的上升沿采样到rd为高时,FIFO输出数据。此外,当FIFO为空时,empty信号输出为高,当FIFO满时,full信号输为无高。
- 复位时,空满信号的复位状态
- 非边界条件下,FIFO的写入与读取,数据比对
- 边界条件下,FIFO写满,满信号的输出
- 边界条件下,FIFO读空,空信号的输出
- 边界条件下,FIFO为空,进行写数据,空信号的撤销
- 边界条件下,FIFO为满,进行读数据,满信号的撤销
- FIFO已满下,依然wr为高下,FIFO中数据是否变化
14.用D触发器搭建4进制的计数器。
module cnt4
(
input clk,
input rst_n,
input ena,
output [2:0] cnt,
output reg cout
);
reg [2:0] cnt_reg;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt_reg <= 1'b0;
else if (cnt_reg == 3'b011&& ena)
cnt_reg <= 1'b0;
else
cnt_reg <= cnt_reg + 1'b1;
end
assign cnt = cnt_reg;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
cout <= 1'b0;
else if (cnt_reg == 3'b011 && ena)
cout <= 1'b1;
else
cout <= 1'b0;
end
endmodule
15.设计一个同步fifo,读写时钟相同,其中在写入时每100个时钟周期会写10个,具体哪个时刻写入不确定,在读出侧每10个cycle会读1个,计算FIFO的最小深度?
18个
16.如下代码在综合时是否可以综合出时钟门控电路?如果能,画出时钟门控示意图,如果不能,请修改使信号out可以综合出时钟门控电路。
always @(posedge clk or negadge rst_n) begin
if(rst_n==1' b0)
out <= 64' b0;
else if (out en)
out<= data;
else
out<=64'b0;
end
不能,去掉 out <= 64'b0
就可以综合出时钟门控
编程题
17.用Verilog语言实现一个带使能的模100异步清0计数器;模块定义为module count (out, count_en, clr, clk);
module count (
input clk,
input clr,
input count_en,
output [6:0] out
);
reg [6:0] cnt;
always @(posedge clk or clr)begin
if(clr)
cnt <= 1'b0;
else if (cnt == 99 && count_en)
cnt <= 1'b0;
else
cnt <= cnt + 1'b1;
end
assign out = cnt;
endmodule
18.画出可以检测11101串的状态转移图,并用Verilog实现FSM;要求每检测到一次该序列,输出2个周期的高电平信号;要求使用低功耗的状态机编码方式;
module check_seq
(
input clk,
input rst_n,
input din,
output match
);
parameter idle = 6'b000_001, s0 = 6'b000_010, s1 = 6'b000_100, s2 = 6'b001_000,
s3 = 6'b010_000, s4 = 6'b100_000;
reg [5:0] state, next_state;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
state <= idle;
else
state <= next_state;
end
always @(*)begin
next_state[0] = !din & (state[1] || state[2] || state[4] || state[5] || state[0]);
next_state[1] = din & state[0];
next_state[2] = din & (state[1] || state[5]);
next_state[3] = din & (state[2] || state[3]);
next_state[4] = ~din & state[3];
next_state[5] = din & state[4];
end
wire pulse;
assign pulse = state[5];
reg [1:0] cnt;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt <= 1'b0;
else if (next_state[5])
cnt <= 2'b11;
else
cnt <= cnt << 1;
end
assign match = cnt[1];
endmodule
// --------------------- testbench ---------------------
module tb;
reg clk, rst_n;
wire din, pulse;
initial begin
clk = 1'b0;
#5 clk = 1'b1;
forever #5 clk = ~clk;
end
initial begin
rst_n = 1'b0;
#9 rst_n = 1'b1;
#1500
$finish;
end
reg [15:0] req;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
req <= 16'b0_0111_0111_0100;
else
req <= req << 1;
end
assign din = req[15];
check_seq dut (
clk, rst_n, din, pulse
);
initial begin
$dumpfile("showmebug.vcd");
$dumpvars(0, tb);
end
endmodule
`timescale 1ns/1ns
// ------------- dual port ram ----------------------
module dual_port_RAM#(
parameter WIDTH = 8,
parameter DEPTH = 16
)(
input wclk,
input rclk,
input wenc,
input renc,
input [$clog2(DEPTH)-1:0] waddr,
input [$clog2(DEPTH)-1:0] raddr,
input [WIDTH-1:0] datain,
output reg [WIDTH-1:0] dataout
);
reg [WIDTH-1:0] mem [DEPTH-1:0];
always @(posedge wclk)begin
if(wenc)
mem[waddr] <= datain;
end
always @(posedge rclk) begin
if(renc)
dataout <= mem[raddr];
end
endmodule
// -----------------------------------------------
module sfifo#(
parameter WIDTH = 8,
parameter DEPTH = 16
)(
input clk,
input rst_n,
input winc,
input rinc,
output reg wfull,
output reg rempty,
input [WIDTH-1:0] wdata,
output [WIDTH-1:0] rdata
);
parameter ADDR_WIDTH = $clog2(DEPTH);
reg [ADDR_WIDTH:0] wr_ptr, rd_ptr;
wire wenc, renc;
// assign full = (wr_ptr - rd_ptr) == DEPTH;
// assign empty = wr_ptr == rd_ptr;
assign wenc = !wfull & winc;
assign renc = !rempty & rinc;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
wfull <= 1'b0;
rempty <= 1'b0;
end
else begin
wfull <= (wr_ptr - rd_ptr) == DEPTH;
rempty <= wr_ptr == rd_ptr;
end
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
wr_ptr <= 1'b0;
else if(wenc)
wr_ptr <= wr_ptr + 1'b1;
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
rd_ptr <= 1'b0;
else if (renc)
rd_ptr <= rd_ptr + 1'b1;
end
dual_port_RAM #(.WIDTH(WIDTH), .DEPTH(DEPTH))
inst (
clk, clk, wenc, renc, wr_ptr[ADDR_WIDTH-1:0], rd_ptr[ADDR_WIDTH-1:0],
wdata, rdata
);
endmodule
标签:clk,笔试,FIFO,rst,input,IC,reg,时钟 来源: https://www.cnblogs.com/pu1se/p/16558219.html