1/10[单选|3分]
十六进制数0x12345678为big-endian格式,对应的little-endian格式是:
0x87654321
0x78563412
0x56781234
其他都不正确
2/10[单选|3分]
X,Y是两个无符号定点小数,X的位宽 6bit,最低4bits是小数部分,最高2bits是整数部分;Y的位宽8bit,最低4bits是小数部分,最高4bits 是整数部分;现在需要计算X乘以Y的结果Z,即Z=X*Y,为了保证Z的结果不溢出,Z的整数部分和小数部分至少需要多少个bit?
z的整数部分至少 6bits,小数部分至少 8bits
z的整数部分至少 7bits,小数部分至少 8bits
z的整数部分至少 7bits,小数部分至少 7bits
2的整数部分至少 6bits,小数部分至少 9bits
3/10[单选|3分]
写数据时钟频率fa=80MHz,读数据时钟频率fb=50MHz,在突发传输过程中,数据都是连续读写的,每次读写的突发传输长度为100.那么,在不考虑该FIFO内部读写指针跨时钟域同步延时的情况下,该FIFO的最小深度为
60
59
37
38
4/10[单选|3分]
下列verilog语句,哪个不能综合
5/10[单选|3分]
下列关于单元时序说法正确的是
Setup time 和 hold time 必须为正
Setup time 和 hold time 可同时为负
Setup time 可以为负, hold time 必须为正
Setup time 和 hold time 可有任意一个为负
6/10[单选|3分]
原始数据的编码效率为1/2,然后以16QAM的编码(4bit映射为一个16QAM符号)映射到一个OFDM symbol的48个子载波上,每个OFDM symbol的时长为4us,则用户层面有效的数据传输速率为
12Mbps
24Mbps
36Mbps
48Mbps
7/10[单选|3分]
C语言和RTL想比明显的不同是:
难以描述设计对象的逻辑关系
难以描述设计对象的时间关系
难以描述设计对象的运算关系
难以描述设计对象的层次关系
8/10[单选|3分]
N比特的格雷码Gray[N-1:0]转换成N比特的二进制码Bin[N-1:0],Bin[0]的逻辑表达式为:
Gray[1]^Gray[0]
Gray[N-1]^Gray[N-2]
^Gray[N-1:0]
^Gray[N-2:0]
9/10[单选|3分]
下列低功耗措施中可以降低峰值功耗的是
多采用高阈值电压的标准单元
Clock gating
Power gating
Memory Shutdown
10/10[单选|3分]
下列IO标准中,适用于高速信号传输的是
LVTTL/LVCOMS
LVTTL/SSTL
LVCOMS/HSTL
SSTL/HSTL
1/5 [填空 | 4分]
下面代码在执行结束后,a= , b= , c= , d= 。
program tb;
reg a = 0;
reg b = 0;
reg c = 0;
reg d = 0;
initial begin
a = 1;
b = a;
end
initial begin
c <= 1;
d <= c;
end
endprogram
2/5 [填空 | 4分]
UVM中可以应用factory override机制的三个条件包括分别是1 , 2 ,3 。
3/5 [填空 | 4分]
DCDC和LDO的区别
4/5 [填空 | 4分]
数字设计中考虑的“PPA”三要素分别指的是 。
5/5 [填空 | 4分]
Verilog 中 task 和 function的区别是:1 至少有一个输入变量;2至少有一个返回值;3可以包含时序控制;4可以定义自己的仿真时间单位
1/2[问答 | 25分]
题目描述
编写N倍时钟倍频器的仿真模型。输入是频率未知的参考时钟。输出时钟的上升沿与参考时钟的上升沿同步。
`timescale 1ns/10ps
module mul_clk #(
parameter N=4 //倍频系数
)(
input src_clk, //输入参考时钟
output out_clk//输出时钟
);
//TODO:在下面编写你的代码
endmodule
`timescale 1ns/1nsmodule Mul_clk_tb();
reg clk;
reg [3:0] clk_tmp;
wire clk1;
//CYCLE 和 NUM 需满足倍数关系
parameter NUM = 4;
parameter CYCLE = 20;initial beginclk = 1;forever begin#CYCLE clk = ~clk;end
endgenvar i;
generate
for(i=0;i<NUM;i=i+1)begin:delay_gen
always @(*) beginclk_tmp[i] = #((20/NUM)*i) clk;end
end
endgenerateassign clk1 = ^clk_tmp;endmodule
2/2[问答 | 25分]
按照row-by-row的方式,将模块输入(每个cycle输入1bit数据,一共32个bits)写入Memory中,保证每行每次写入Ncol bits数据,一共写Nrow次。Memory总大小为Ncol*Nrow bits。
其中Ncol=4,Nrow=8,w_idx=0,1,…,31为数据写入Memory后的位置序号,如下图:
图w_idx在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中读出数据输出。
请用Verig语言编写代码描述上述写Memory然后读Memory的行为,其中Memory可用寄存器数组来实现。接口信号如下:
input din,
input din_valid,
input rst_n,
input clk,
output dout,
output dout_valid
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) begincnt0 <= 0; endelse if(add_cnt0) beginif(end_cnt0)cnt0 <= 0; elsecnt0 <= 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) begincnt1 <= 0; endelse if(add_cnt1) beginif(end_cnt1)cnt1 <= 0; elsecnt1 <= 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)beginmem[i] <= 'h0;end else if(din_vld)beginmem[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)beginram[j] <= 'h0;end else if(din_vld || add_cnt3)beginram[w_idx] <= r_idx;end
end
endgenerate //assign w_idx = (cnt1*4) + (cnt0);always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginw_idx <= 0;endelse if(din_vld) beginw_idx <= (cnt1*4) + (cnt0);end
endassign r_idx = NCOL*(w_idx%NROW) + (w_idx/NROW);always @(posedge clk or negedge rst_n) begin if (rst_n==0) begincnt2 <= 0; endelse if(add_cnt2) beginif(end_cnt2)cnt2 <= 0; elsecnt2 <= 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) begincnt3 <= 0; endelse if(add_cnt3) beginif(end_cnt3)cnt3 <= 0; elsecnt3 <= cnt3+1 ;end
end
assign add_cnt3 = (end_cnt2);
assign end_cnt3 = add_cnt3 && cnt3 == (NROW)-1 ;always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginflag_add <= 0;endelse if(end_cnt1)beginflag_add <= 1;endelse if(end_cnt3)beginflag_add <= 0;end
endwire[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 beginclk = 1;forever begin#CYCLE clk = ~clk;end
endinitial beginrst_n = 0;#(15*CYCLE)rst_n = 1;
endinitial begindin = 1;forever begin#(2*CYCLE)din = $random;end
endinitial begindin_vld = 0;#(20*CYCLE)repeat(32)begin#(4*CYCLE)din_vld = 1;#(2*CYCLE)din_vld = 0;end
endmem_rw mem_inst(.din (din ),.din_vld(din_vld),.clk (clk ),.rst_n (rst_n ));endmodule