其他分享
首页 > 其他分享> > IC笔试题

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做逻辑综合

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信号输为无高。

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