乐鑫2022数字IC岗位提前批笔试题

答案为自己查阅资料之后所作,有些题不敢保证完全正确,在相对应的题号下也给出了自己的疑问,有想法的同学可留言讨论

一、选择

1.以下关于System Verilog的描述,正确的

A:sv中可以用logic代替Verilog中的wire和reg类型

B:sv中,定义成reg的信号会被综合成触发器

C:sv中的function语言不可被综合

D:其他都不正确

E:sv是提供给验证使用的,因此不能被综合

2.UVM层次化结构中,最顶层的部件类型是?

A:uvm_test
B:uvm_root
C:uvm_top
D:uvm_component

3.数字信号上采样时,一般需要添加什么样的滤波器,完成功能为?

A:高通,抗混叠滤波

B:低通,抗周期延拓

C:低通,抗混叠滤波

D:高通,抗周期延拓

4.下列不属于异步总线的是

A:SPI

B:USB

C:UART

D:IIC
注:第四题有待商榷

5.()电路的逻辑功能特点是,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关

A:静态逻辑

B:组合逻辑

C:动态逻辑

D:时序逻辑

6.在芯片设计流程当中,通常会进行后仿真(post-simulation),关于后仿的作用,以下说法不正确的是

A:抽检netlist是否和RTL功能一致

B:抽检电路中是否出现有害的glitch

C:抽检时序是否有违规

D:抽检电路中是否存在亚稳态

7.以下关于异步处理正确的是

A:信号经过两级触发器即可完成异步信号的传递

B:只要信号传递的两端时钟频率不相等,即认为是异步信号

C:异步复位信号需要经过同步处理后再使用是安全的

D:异步FIFO中使用格雷码传递异步计数器可以保证每一拍传递的数据都是准确的

8.关于跨时钟域电路的设计,以下说法正确的是

A:单bit信号经两级D触发器同步后即可进行跨时钟域传递

B:采用单一时钟的电路不会产生亚稳态

C:异步FIFO的两个时钟频率相同也可以正常工作

D:跨时钟域电路当中的亚稳态无法消除

注:第8题有疑问

9.衡量数字通信系统传输质量的指标是

A:信噪比

B:噪声功率

C:语音清晰度

D:误码率

10.以下代码片段实现的电路功能是

Input [3:0] in;

output [3:0] out;

wire [3:0] a,b;

assign a=in<<1;

assign b=in>>3;

assign out=a|b;

A:对输入信号in先右移3位,再左移1位

B:对输入信号in循环左移1位

C:对输入信号in循环右移3位

D:对输入信号in先左移1位,再右移3位

注:B和C应该都是对的

二:填空

1.verilog当中a=4'b10x1;b=4'b10x1;那么逻辑表达式a==b为(x)a===b为(1);

2.4bit的信号输入和8bit的信号输入的乘法器内部计算输出信号至少需要(12)bit的位宽;

3.通常情况下,芯片工作温度较(低),工作电压较(高),速度最快。

4.以下代码的打印输出是

always@(posedge clk)

begin

a=0;

a<=1;

$display(“%0b”,a);

end

答案:0

注:第4题注意阻塞和非阻塞赋值的区别,同时去了解0b和b的区别。

5.全部使用组合逻辑实现复数A,B,C的运算|A*(B+C)|^2时, 共需使用()个乘法器与()个加法器

答案:6个乘法器,5个加法器

注释:此题不完全确定,有想法的同学可留言讨论

三、问答

此题a是看波形写代码,比较简单
此题b是:使用verilog编写一根单向导线wire_a仿真模型,此导线的传输延迟为5ns,且不会过滤此波形。

`timescale 1ns/10ps
module wire_a(
    input    in,//输入
    output    out //输出
); 

答案:

a:

`timescale 1ns/10ps

module wave_gen();

reg wave;

initial begin
wave=0;
#2 wave=1;
#3 wave=0;
#5 wave=1;
#5 wave=0;
#1 wave=1;
#1 wave=0;
#5 wave=1;
#1 wave=0;
#4 wave=1;
#3 wave=0;
end

endmodule

b:
reg out_reg;
always@(*) begin
out_reg <= #2 in;
end

参考:链接说明

2.题目描述:

使用Verilog/SV撰写如下功能模块;求输入信号序列din在din_vld为高电平的时间段内的次小值和次小值

出现的次数。接口信号如下,

module sec_min(
input clk, //时钟信号
input rst_n, //复位信号
input [9:0] din, //10bit无符号数
input din_vld, //输入数据有效信号
output [9:0] dout, //次小值
output [8:0] cnt //次小值出现的次数,溢出时重新计数
);

endmodule

//乐鑫2022提前批最后一道答题
//进行过几种情况的验证,结果正确。
//如果出现问题,可留言或私信一起讨论。

module sec_min(
    input   clk,                //时钟信号
    input   rst_n,              //复位信号
    input   [9:0]   din,        //10bit无符号数
    input   din_vld,            //输入数据有效信号
    output  [9:0]   dout,       //次小值
    output  [8:0]   cnt          //次小值出现的次数,溢出时重新计数
);

reg    [9:0]    min_data;
reg    [9:0]    sub_data;
reg    [9:0]    data_reg;
reg    [1:0]    data_cnt;
reg    [8:0]    sub_cnt;
reg   [8:0] min_cnt;

//寄存一拍
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        data_reg<='d0;
    end
    else if(din_vld) begin
        data_reg<=din;
    end
    else begin
        data_reg<='d0;
    end
end


//计数器,区分第一个数据,第二个数据,和其他的数据
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        data_cnt<='d0;
    end
    else if(din_vld) begin
        if(data_cnt<'d3)begin
            data_cnt<=data_cnt+1;
        end
        else begin
            data_cnt<='d3;
        end
    end
    else begin
        data_cnt<='d0;
    end
end


//分情况讨论,第一个数据来的时候,将第一个数据给最小值和次小值;在第二个数据来的时候,分情况讨论;在第三个及后面的数据来的时候,分情况讨论。
always@(posedge clk or negedge rst_n )begin
    if(!rst_n)begin
        min_data<='d0;
        sub_data<='d0;
    end
    if(din_vld) begin
        min_data<=data_reg;
        sub_data<=data_reg;
        if(data_cnt=='d1)begin
            min_data<=data_reg;
            sub_data<=data_reg;
        end
        else if(data_cnt=='d2)begin
            if(data_reg<min_data)begin
                min_data<=data_reg;
                sub_data<=min_data;
            end
            else begin
                min_data<=min_data;
                sub_data<=data_reg;
            end
        end
        else if(data_cnt=='d3) begin
            if(data_reg<min_data)begin
                min_data<=data_reg;
                sub_data<=min_data;
            end
            else if(data_reg==min_data)begin
                min_data<=min_data;
                sub_data<=sub_data;
            end
            else if(data_reg<=sub_data)begin
                min_data<=min_data;
                sub_data<=data_reg;
            end
            else begin
                min_data<=min_data;
                sub_data<=sub_data;
            end
        end        
    end
    else begin
        min_data<='d0;
        sub_data<='d0;
    end 
end


//根据数据来的顺序和数值来进行次小值和最小值出现次数的计算
//然后分情况讨论,当新值比最小值小的时候,就要将min_cnt赋值给sub_cnt
//其他情况比较容易想到,有问题请留言讨论
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        sub_cnt<='d0;
        min_cnt<='d0;
    end
    else if(din_vld) begin
        if(data_cnt==1)begin
            sub_cnt<='d1;
            min_cnt<='d1;
        end
        else if(data_cnt==2||data_cnt==3)
        if(data_reg<min_data)begin
            sub_cnt<=min_cnt;
            min_cnt<='d1;
        end
        else if (data_reg==min_data)begin
            sub_cnt<=sub_cnt;
            min_cnt<=min_cnt+1;
        end
        else if(data_reg<sub_data)begin
            sub_cnt<='d1;
            min_cnt<=min_cnt;
        end
        else if(data_reg==sub_data) begin
            sub_cnt<=sub_cnt+1;
            min_cnt<=min_cnt;
        end
        else begin
            sub_cnt<=sub_cnt;
            min_cnt<=min_cnt;
        end
    end
    else begin
        sub_cnt<='d0;
        min_cnt<='d0;
    end
end

//进行输出
assign    dout=sub_data;
assign     cnt=sub_cnt;

endmodule