仅使用2位数据验证PRBS 7序列

时间:2019-05-30 00:12:37

标签: random verilog system-verilog dpi

我有一个8位的PRBS 7生成器,我只需要在检查器端使用来自生成的PRBS 7数据的LSB中的2位,即可验证模式是否遵循prbs序列。

有两个组成部分; 1个PRBS生成器和1个PRBS检查器

PRBS生成器将生成8位PRBS 7序列data_gen [7:0];

PRBS CHECKER将使用data_gen [1:0]并检查序列是否遵循prbs 7。

生成器代码:

`timescale 1ns / 1ps

module Patgen (
input         clk,
input         arstn,
output [7:0]  patgen_data
);

reg  [7:0] lfsr_shift;
wire [7:0] prbs7_data;

   assign prbs7_data[0] = lfsr_shift[2] ^ lfsr_shift[1];
   assign prbs7_data[1] = lfsr_shift[3] ^ lfsr_shift[2];
   assign prbs7_data[2] = lfsr_shift[4] ^ lfsr_shift[3];
assign prbs7_data[3] = lfsr_shift[5] ^ lfsr_shift[4];
assign prbs7_data[4] = lfsr_shift[6] ^ lfsr_shift[5];
assign prbs7_data[5] = lfsr_shift[7] ^ lfsr_shift[6];
assign prbs7_data[6] = lfsr_shift[1] ^ lfsr_shift[2] ^ lfsr_shift[7];
assign prbs7_data[7] = lfsr_shift[3] ^ lfsr_shift[1];


always @ (posedge clk or negedge arstn)
 if(~arstn_patgen) lfsr_shift <= 8'hff;
 else lfsr_shift  <= prbs7_data; 

assign patgen_data = lfsr_shift;

endmodule 

检查码

`timescale 1ns / 1ns 
module Prbs_chk (
input [1:0]  prbs_prbs_datain,
input        clk,
input        clear,
output       error_sig           
);

reg     [11:0]  prbs_data_reg_r; 
wire    [11:0]  prbs_data_reg; 
wire    [5:0]  next_Dta;
reg     [5:0]  next_Dta_ff;
wire           error;


always @( posedge clk )
  prbs_data_reg_r <= {prbs_prbs_datain[1:0], prbs_data_reg_r[11:2]};


assign prbs_data_reg = prbs_data_reg_r;

assign  next_Dta[0] = prbs_data_reg[1]^prbs_data_reg[0];
assign  next_Dta[1] = prbs_data_reg[2]^prbs_data_reg[1];
assign  next_Dta[2] = prbs_data_reg[3]^prbs_data_reg[2];
assign  next_Dta[3] = prbs_data_reg[4]^prbs_data_reg[3];
assign  next_Dta[4] = prbs_data_reg[5]^prbs_data_reg[4];
assign  next_Dta[5] = prbs_data_reg[6]^prbs_data_reg[5];

always @( posedge clk )
   next_Dta_ff[5:0] <= next_Dta[5:0];


assign  error = (next_Dta[1:0] != prbs_data_reg[8:7]) | 
               ({next_Dta[5:0], next_Dta_ff[5:0]} == 12'd0);


reg patchk_reg;
always @ (posedge clk)
 if (clear)  patchk_reg <= 1'b0;
 else if ( error)         patchk_reg <= 1'b1;

assign error_sig = patchk_reg;

endmodule

我的Checker模块总是给我一个错误。

0 个答案:

没有答案