乐鑫笔试题1

一、将一个串行执行的C语言算法转化为单拍完成的并行可综合verilog

unsigned char cal_table_high_first(unsigned char value)
{
	unsigned char i ;
unsigned  char checksum = value ; 
    for (i=8;i>0;--i)
    {
        if (check_sum & 0x80)
        {
            check_sum = (check_sum<<1) ^ 0x31;
        }
        else
        {
            check_sum = (check_sum << 1);
        }
    }
    return check_sum;
}

Verilog如下

module c2verilog(
 input rst_n,
 input clk,
 input [7:0] value,
 output reg [7:0] check_sum
 );

//c程序在verilog中用函数(组合逻辑)实现 
function  [7:0]  check(input [7:0] value);
reg [3:0] i;
begin
	check=value;
	for(i=8;i>0;i=i-1)
	check=(check<<1)^({8{check[7]}}& 8'h31); //化简后的组合逻辑,也可不化简
end
endfunction
 
 //时序逻辑调用函数,一个节拍完成
always@(posedge clk)
if(!rst_n)
	check_sum<=0;
else
	check_sum<=check(value);

 endmodule

tb(sv)如下

class valuerand;
rand bit [7:0] value;
endclass

module tb( );
logic rst_n, clk;
logic [7:0] value, check_sum;

c2verilog c2verilog(rst_n, clk, value, check_sum);
initial
begin clk=0; forever #5 clk=~clk; end

valuerand p;
initial
begin rst_n=0; #30 rst_n=1;
p=new();
for(int i=0; i<30; i=i+1)
begin #10 assert(p.randomize());
value=p.value;
end
end
endmodule

二、设计一个序列信号发生器电路,能在CLK信号作用下周期性输出“0010110111”的序列信号

(相当于使用移位寄存器串行输出,左移或者右移均可)

Verilog如下

module creatseq (
input clk,
input rst_n,
output data
);
reg [9:0] seq;

//寄存器复位值为序列
//循环左移
always@(posedge clk)
	if(!rst_n) seq<=10'b00_1011_0111;
	else seq<={seq[8:0],seq[9]};

assign data=seq[9];
endmodule

tb(sv)

module creatseq (
input clk,
input rst_n,
output data
);
reg [9:0] seq;
always@(posedge clk)
if(!rst_n) seq<=10'b00_1011_0111;
else seq<={seq[8:0],seq[9]};

assign data=seq[9];
endmodule

原文参考https://blog.csdn.net/buzhiquxiang/article/details/106642189

你可能感兴趣的:(Verilog,verilog)