【开卷】第1期(下):乐鑫领跑者数字IC笔试题(含答案)
【单选题 4’x15=60’】
1.下列verilog语句,哪个不能综合?
A.
wire [3:0] in;
reg out;
always @(*) begin
casez (in)
4'b1???:out=1'b1;
4'b01??:out=1'b0;
4'b00??:out=1'b1;
default:out=1'b0;
endcase
end
B.
wire [7:0] a, b;
reg [7:0] c;
integer i;
always@ (*) begin
for (i=0; i<8; i=i+1) begin
c[i]= a[i] & (|b[7: 7-i]);
end
end
C.
wire [31:0] in;
wire [1 :0] sel;
wire [7 :0] out;
assign out = in[8*sel+:8] ;
D.
wire [7:0] in_1,in_2;
reg [7:0] out;
integer i;
always@ (posedge clk) begin
for (i=0; i<8; i=i+1) begin
out[i]<=in_1[i]^in_2[i];
end
end
参考答案:A
解析:本题主要考查应试者对Verilog中不可综合电路的理解与记忆
【注】:对于casez,也有些综合工具是可以综合的,这种情况下只能用“排除法”了,其他三个显然都是可以综合的嘛,没啥选了,那就只能选它了。
reg[7:0]a, b;
initial begin
a=100;
b=200;
#10ns;
a=10;
#10ns;
b<=a;
end
initial begin
#20ns;
b<=50;
end
A. a=10,b=8 'hx;
B. a=10,b=50;
C. a=10,b=无法确定;
D. a=10,b=10;
参考答案:D(ModelSim SE-64 10.5 仿出来是D,但是我无法理解!!!)备注:我用VCS跑出来也是D,同样,无法理解
解析:本题主要考查应试者对Verilog TestBench中阻塞赋值和非阻塞赋值的理解。
测试代码:
module tb_led();
reg[7:0]a, b;
initial begin
a=100;
$display ("initial1-1 [%0t] a=0x%0h b=0x%0h", $time, a, b);
b=200;
$display ("initial1-2 [%0t] a=0x%0h b=0x%0h", $time, a, b);
#10;
a=10;
$display ("initial1-3 [%0t] a=0x%0h b=0x%0h", $time, a, b);
#10;
b<=a;
$display ("initial1-4 [%0t] a=0x%0h b=0x%0h", $time, a, b);
#1;
$display ("initial1-5 [%0t] a=0x%0h b=0x%0h", $time, a, b);
end
initial begin
#20;
b<=50;
$display ("initial2-1 [%0t] a=0x%0h b=0x%0h", $time, a, b);
#1;
$display ("initial2-2 [%0t] a=0x%0h b=0x%0h", $time, a, b);
end
endmodule
输出结果:
# initial1-1 [0] a=0x64 b=0xx
# initial1-2 [0] a=0x64 b=0xc8
# initial1-3 [10000] a=0xa b=0xc8
# initial2-1 [20000] a=0xa b=0xc8
# initial1-4 [20000] a=0xa b=0xc8
# initial2-2 [21000] a=0xa b=0xa
# initial1-5 [21000] a=0xa b=0xa
A.低通,抗周期延拓
B.高通,抗混叠滤波
C.低通,抗混叠滤波
D.高通,抗周期延拓
参考答案:A
解析:本题主要考查应试者对数字信号中上采样和下采样的理解
1)A == B
2)A === B
A.1,0
B.x,1
C.0,x
D.0,1
参考答案:B
解析:本题主要考查应试者对SystemVerilog中全等于(===)和等于(==)的区别理解
A. forever
B. repeat
C. while
D. force
参考答案:D
解析:本题主要考查应试者对Verilog关键字的理解与记忆。
A. logic 初始值为’x’
B. logic可以完全替换wire类型
C. logic可以完全替换reg类型
D. logic类型是四值逻辑
参考答案:B
解析:本题主要考查应试者对SystemVerilog中logic类型的理解与记忆。
【B】:logic类型只能有一个驱动,可以使用它来查找表单中的漏洞。如果有多个驱动,例如双向总线,这时候这些信号就要被定义成线网类型(常用wire)。
A. int
B. time
C. byte
D. bit
参考答案:B
解析:本题主要考查应试者对SystemVerilog中四值数据类型的理解与记忆。
A. 1100011
B. 1100010
C. 1110001
D. 1011110
参考答案:C
A. Heap段
B. Bss段
C. Stack段
D. Text段
参考答案:B
解析:本题主要考查应试者对C语言内存分配的理解
A. RTL代码
B. 协议或标准
C. 验证IP
D. 设计说明
参考答案:A
解析:本题主要考查应试者对数字IC前端验证测试用例的通过准则理解。
A. IsErr
B. ERR
C. 0_is_err
D. Error
参考答案:C
解析:本题主要考查应试者对Verilog语言标识符命名规则的记忆
rand bit [7:0] a,b,c,d;
constraint cst_abc {
a inside {[50:100]};
b>=a;
c<a;
c>10;
d<=c;
}
A. c可以取10-30之间的任意值
B. b可以取50-100之间的任意值
C. d可以取0-10之间的任意值
D. a可以取60-66之间的任意值
参考答案:A
解析:本题主要考查应试者对SystemVerilog中约束的理解。
【等效约束】:根据题意,容易写出方便我们理解的等效约束,如下图所示。c是不能取到10的!
A. Z的整数部分至少7bits,小数部分至少7bits
B. Z的整数部分至少7bits,小数部分至少8bits
C. Z的整数部分至少6bits,小数部分至少9bits
D. Z的整数部分至少6bits,小数部分至少8bits
参考答案:D
解析:本题主要考查应试者对二进制下定点小数乘法运算的理解
A. 37
B. 59
C. 38
D. 60
参考答案:C
解析:本题主要考查应试者对FIFO最小深度计算的理解
A. 降低电路漏电流
B. 门控时钟
C. 多阈值电压
D. 门级电路的功耗优化
参考答案:B
解析:本题主要考查应试者对低功耗设计的理解,但是需要注意本题的前提是RTL设计阶段
【问答题 20’x2=40’】
用Verilog写一段代码,实现如下的扰码功能。其中扰码生成器的初始种子X7~X1=7’b1010101,每拍输入、输出和扰码器更新一次。
【编程思路】:参考网址
https://blog.csdn.net/ReCclay/article/details/122442371?spm=1001.2014.3001.5501
按照row-by-row的方式,将模块输入(每个cycle输入1 bit数据,一共32个bits)写入Memory中,保证每行每次写入Ncol bits数据,一共写 Nrow次,Memory总大小为 Ncol*Nrow bits。
其中 Ncol=4,Nrow=8,w_ idx=0,1,…,31 时,数据写入Memory后的位置序号如下图所示:
每个写序号w_idx对应一个读序号r_idx, r_ idx由如下公式定义:
r_idx = Ncol*(w_idx mod Nrow)+ floor(w_idx/Nrow)(其中,w_idx=0,1,…31)
按 r_idx 从0~31的顺序,从Memory中读出数据输出。
请用Verilog语言编写代码描述上述写Memory然后读Memory的行为,其中Memory可用寄存器数组来实现。
接口信号如下:
input din,
input din_valid,
input rst_n,
input clk,
output dout,
output dout_valid
解析:本题主要考查应试者的Verilog编程能力以及对Memory读写的理解。
RTL:
module mem_rw(
input din,
input din_vld,
input clk,
input rst_n,
output dout,
output dout_vld
);
parameter NCOL = 4;
parameter NROW = 8;
reg flag_add;
reg [ 1:0] cnt0 ;
wire add_cnt0 ;
wire end_cnt0 ;
reg [2:0] cnt1 ;
wire add_cnt1 ;
wire end_cnt1 ;
reg [3:0] mem [0:7];
reg [4:0] ram [31:0];
reg [4:0] w_idx;
wire [4:0] r_idx;
reg [ 1:0] cnt2 ;
wire add_cnt2 ;
wire end_cnt2 ;
reg [ 2:0] cnt3 ;
wire add_cnt3 ;
wire end_cnt3 ;
always @(posedge clk or negedge rst_n) begin
if (rst_n==0) begin
cnt0 <= 0;
end
else if(add_cnt0) begin
if(end_cnt0)
cnt0 <= 0;
else
cnt0 <= cnt0+1 ;
end
end
assign add_cnt0 = din_vld;
assign end_cnt0 = add_cnt0 && cnt0 == (NCOL)-1 ;
always @(posedge clk or negedge rst_n) begin
if (rst_n==0) begin
cnt1 <= 0;
end
else if(add_cnt1) begin
if(end_cnt1)
cnt1 <= 0;
else
cnt1 <= cnt1+1 ;
end
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1 && cnt1 == (NROW)-1 ;
genvar i;
generate
for(i = 0; i < NROW; i = i + 1 )
begin:mem_initial
always @(posedge clk or negedge rst_n)
if(rst_n == 0)begin
mem[i] <= 'h0;
end
else if(din_vld)begin
mem[cnt1][cnt0] <= din;
end
end
endgenerate
genvar j;
generate
for(j = 0; j < 32; j = j + 1 )
begin:ram_initial
always @(posedge clk or negedge rst_n)
if(rst_n == 0)begin
ram[j] <= 'h0;
end
else if(din_vld || add_cnt3)begin
ram[w_idx] <= r_idx;
end
end
endgenerate
//assign w_idx = (cnt1*4) + (cnt0);
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
w_idx <= 0;
end
else if(din_vld) begin
w_idx <= (cnt1*4) + (cnt0);
end
end
assign r_idx = NCOL*(w_idx%NROW) + (w_idx/NROW);
always @(posedge clk or negedge rst_n) begin
if (rst_n==0) begin
cnt2 <= 0;
end
else if(add_cnt2) begin
if(end_cnt2)
cnt2 <= 0;
else
cnt2 <= cnt2+1 ;
end
end
assign add_cnt2 = (flag_add);
assign end_cnt2 = add_cnt2 && cnt2 == (NCOL)-1 ;
always @(posedge clk or negedge rst_n) begin
if (rst_n==0) begin
cnt3 <= 0;
end
else if(add_cnt3) begin
if(end_cnt3)
cnt3 <= 0;
else
cnt3 <= cnt3+1 ;
end
end
assign add_cnt3 = (end_cnt2);
assign end_cnt3 = add_cnt3 && cnt3 == (NROW)-1 ;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
flag_add <= 0;
end
else if(end_cnt1)begin
flag_add <= 1;
end
else if(end_cnt3)begin
flag_add <= 0;
end
end
wire[2:0] row;
wire[1:0] col;
wire [4:0] index;
wire [4:0] ram_data;
assign index = (cnt3*4) + cnt2;
assign ram_data = ram[index];
assign dout = (add_cnt2)? mem[row][col]:0;
assign dout_vld = add_cnt2;
assign row = ram_data/4;
assign col = ram_data%4;
endmodule
TB:
module mem_tb();
reg din;
reg din_vld;
reg clk;
reg rst_n;
parameter CYCLE = 10;
initial begin
clk = 1;
forever begin
#CYCLE clk = ~clk;
end
end
initial begin
rst_n = 0;
#(15*CYCLE)
rst_n = 1;
end
initial begin
din = 1;
forever begin
#(2*CYCLE)
din = $random;
end
end
initial begin
din_vld = 0;
#(20*CYCLE)
repeat(32)begin
#(4*CYCLE)
din_vld = 1;
#(2*CYCLE)
din_vld = 0;
end
end
mem_rw mem_inst(
.din (din ),
.din_vld(din_vld),
.clk (clk ),
.rst_n (rst_n )
);
endmodule
本文首发于微信公众号【 数字IC打工人】
收录各大芯片公司笔试真题