乐鑫科技2022提前批-数字IC类6.29

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/1ns

module Mul_clk_tb();
reg clk;
reg [3:0] clk_tmp;
wire clk1;
//CYCLE 和 NUM 需满足倍数关系
parameter NUM = 4;
parameter CYCLE = 20;

initial begin
    clk = 1;
    forever begin
        #CYCLE clk = ~clk;
    end
end

genvar i;
generate
for(i=0;i<NUM;i=i+1)begin:delay_gen
always @(*) begin
       clk_tmp[i] = #((20/NUM)*i) clk;
   end
end
endgenerate


assign 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) 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

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值