10.基于 MARCH C+ 算法的SRAM BIST

SRAM BIST 顶层
RSAM BIST 结构图'

SRAM BIST : MEM_BIST.V

sql 复制代码
////////////////////////////////////////////
//Author : jian qiao 
//Revision History : 2020-4-1 
// Revision : 1.0
//Eailbox : jianqiaojia@dingtalk.com
//////////////////////////////////////////
`timescale 1ns/1ps
module mem_bist ( clk,rstn,error,done);

parameter data_size = 8;
parameter addr_size = 8;
parameter word_depth = 256;

input clk;
input rstn;

output errro;
output done;

wire [data_size-1:0] datalock;
wire [addr_size-1:0] a;
wire [data_size-1:0] d;
wire [data_size-1:0] q;
wire wen;
wire cen;

control dut1 (
              .clk (clk),
              .rstn (rstn),
              .wen (wen),
              .cen (cen),
              .addr (a),
              .data (d),
              .datalock (datalock)
             );
data_comparator dut2 (
.clk (clk),
.rstn (rstn),
.q (q),
.datalock (datalock),
.wen (wen),
.error (error),
.done (done)
                        );

ram dut3 (
.clk (clk),
.cen (cen),
.wen (wen),
.a (a),
.d (d),
.q (q)
            );

endmodule 

CONTROL.V

sql 复制代码
////////////////////////////////////////////
//Author : jian qiao 
//Revision History : 2020-4-1 
// Revision : 1.0
//Eailbox : jianqiaojia@dingtalk.com
//////////////////////////////////////////

`tiemscale 1ns/1ps
module control (clk,rstn,wen,cen,addr,data,datalock);

parameter addr_size = 8;
parameter data_size = 8;
parameter word_depth = 256;

input clk;
input rstn;

output wen;
output cen;
output [addr_size-1:0] addr;
output [data_size-1:0] data;
output [data_size-1:0] datalock;

reg wen;
reg cen;
reg [addr_size-1:0] addr;
reg [data_size-1:0] data;
reg [data_size-1:0] datalock;
reg [1:0] pattern;
reg i;
reg [3:0] state;

parameter data_b1 = 8'b0000_0000;
parameter data_b2 = 8'b0000_1111;
parameter data_b3 = 8'b0101_0101;
parameter data_b4 = 8'b0011_0011;

parameter idle = 4'd0,
          s1 = 4'd1,
          s2 = 4'd2,
          s3 = 4'd3,
          s4 = 4'd4,
          s5 = 4'd5,
          s6 = 4'd6,
          updata = 4'd7,
          stop = 4'd8;
always @ (posedge clk or negedge rstn)
begin 
     if (!rstn)
     begin 
          cen <= 1'b1;
          wen <= 1'b0;
          pattern <= 2'b0;
          data <= data_b1;
          addr <= 8'd0;
          datalock <= 8'd0;
          i <= 1'b0;
          state <= idle;
     else 
     begin 
           case (state )

           idle : begin 
             cen <= 1'b0;
             wen <= 1'b0;
             addr <= word_depth-1;
             data <= data_b1;
             pattern <= 2'd0;
             i <= 1'b0;
             state <= s1;
           end 

           s1 : begin 
             if (addr > 8'd0)
             begin 
               addr <= addr - 8'd1;
               state <= s1;
             end 
             else 
             begin 
                addr <= 8'd0;
                wen <= 1'b1;
                data <= ~data;
                datalock <= data;
                state <= s2;
             end 
             end 

            s2 : begin 
            if (wen == 0)
            beign 
              wen <= 1'b1;
              datalock <= ~datalock;
              state <= s2;
            end 
            else if (i==0)
            begin 
              wen <= 1'b0;
              i <= 1'b1;
              state <= s2;
            end 
            else if(addr <= word_depth -1 )
            begin  
               state <= s2;
               addr <= addr 8'd1;
               i <= 1'b0;
               datalock <= ~datalock;
            end 
            else 
            begin 
              addr <= 8'd0;
              data <= ~data;
               state <= s3;
               i <= 1'b0;
              datalock <= data;
            end 
            end 

           s3 : begin 
           if (wen == 1'b0)
           begin 
                wen <= 1'b1;
                datalock <= ~datalock;
                state <= s3;
            end 
           else if (i == 0)
           begin 
              wen <= 1'b0;
              i <= 1'b1;
              state <= s3;
           end 
           else if (addr < word_depth -1)
           begin 
              addr <= addr + 8'd1;
              i <= 1'b0;
              datalock <= ~datalock;
              state <= s3; 
           end 
           else 
           begin 
             addr <= word_depth -1;
             data <= ~data;
             i <= 1'b0;
             datalock <= data;
             state <= s4;
           end 
           end

           s4 : begin 
           if (wen == 0)
           begin 
             wen <= 1'b1;
             datalock <= ~datalock;
             state <= s4;
           end 
           else if (i == 0)
           begin 
             wen <= 1'b0;
             i <= 1'b1;
             state <= s4;
           end 
           else if ( addr > 8'd0)
           begin 
             addr <= addr - 8'd1;
             datalock <= ~datalock;
             i <= 1'b0; 
             state <= s4;
           end 
           else 
           begin 
             addr <= word_depth -1;
             data <= ~data;
             datalock <= data;
             i <= 1'b0;
             state <= s5;
            end 
            end 
 
          s5 : begin 
          if (wen == 0)
          begin 
               wen <= 1'b1;
               datalock <= ~datalock ;
               state <= s5;
          end 
          else if (i == 0)
          begin  
             i <= 1;
             wen <= 0;
             state <= s5;
          end 
          else if ( addr > 8'd0)
          begin 
             i <= 0;
             addr <= addr - 8'd1;
             datalock <= ~datalock;
             state <= s5;
          end 
          else 
          begin 
             addr <= 8'd0;
             datalock <= data;
             state <= s6;
           end 
          end 

          s6 : begin 
          if (addr < word_depth -1)
              addr <= addr + 8'd1;
           else  
           begin 
             wen <= 0;
             i <= 0;
             state <= updata;
           end 
          end 

         updata : begin 
         if (pattern == 0)
          begin 
            data <= data_b2;
            pattern <= pattern + 1;
            state <= s1;
           end 
         else if (pattern == 1)
         begin
            data <= data_b3;
            pattern <= pattern + 1;
            state <= s1;
         end 
         else if ( pattern == 2 )
         begin 
            data <= data_b4;
            pattern <= pattern + 1;
            state <= s1;
         end 
         else  
            state <= stop;
         
         stop : begin 
            cen <= 1;
         end 
   
         default : state <= idle;
         
        endcase 
    end 
 end 

endmodule 
            

DATA_COMPATATOR.V

sql 复制代码
////////////////////////////////////////////
//Author : jian qiao 
//Revision History : 2020-4-1 
// Revision : 1.0
//Eailbox : jianqiaojia@dingtalk.com
//////////////////////////////////////////

`timescale 1ns/1ps
module data_comparator ( clk ,rstn,datalock,wen,q,error,done);

parameter addr_size = 8,
          data_size = 8,
          word_depth = 256;

input wen;
input [data_size-1:0] datalock;
input clk;
input rstn;
input [data_size-1:0] q;

output error;
output done;

reg error;
reg done;
reg [data_size-1:0] q1;
reg [data_size-1:0] datalock1;

always @ (posedge clk or negedge rstn)
beign 
     if (!rstn)
     begin 
       error <= 0;
       done <= 0;
       q1 <= 8'd0;
       datalock1 <= 8'd0;
     end 
     else 
     begin 
        q1 <= q;
        datalock1 <= datalock;
        if (wen == 1)
        beign 
             if (datalock1 == q1)
             begin 
                error <= 0;
                done <= 1;
             end 
             else 
             begin 
                error <= 1;
                done <= 1;
             end
         end 
         else  beign 
           error <= error;
           done <= done ;
          end 
      end 
 end 

endmodule 

实现时序图

sram 的话就不挂了,那部分相对来说比较简单,很容易就可以写出啦。

希望我的个人练习对你有借鉴价值。

相关推荐
好奇龙猫2 分钟前
【人工智能学习-AI-MIT公开课第 15 讲学习:相近差错、受适应条件】
学习
崇山峻岭之间9 分钟前
Matlab学习记录24
javascript·学习·matlab
半夏知半秋23 分钟前
rust学习-循环
开发语言·笔记·后端·学习·rust
阿豪只会阿巴23 分钟前
【多喝热水系列】从零开始的ROS2之旅——Day5
c++·笔记·python·ubuntu·ros2
Haooog24 分钟前
LangChain4j 学习
java·学习·大模型·langchain4j
十二测试录30 分钟前
接口测试,一些常见问题
经验分享·功能测试·测试工具·集成测试·压力测试·postman·可用性测试
WarPigs31 分钟前
数据库笔记
数据库·笔记
星火开发设计34 分钟前
折半插入排序原理与C++实现详解
java·数据结构·c++·学习·算法·排序算法·知识
欧阳天羲39 分钟前
ML工程师学习大纲
学习·算法·决策树
Hcoco_me41 分钟前
大模型面试题43:从小白视角递进讲解大模型训练的梯度累加策略
人工智能·深度学习·学习·自然语言处理·transformer