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 的话就不挂了,那部分相对来说比较简单,很容易就可以写出啦。

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

相关推荐
觉醒大王5 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
feasibility.5 小时前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
三水不滴5 小时前
计网:输入网址到网页显示
经验分享·笔记·计算机网络
YCY^v^6 小时前
JeecgBoot 项目运行指南
java·学习
云小逸6 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
JustDI-CM6 小时前
AI学习笔记-提示词工程
人工智能·笔记·学习
悟纤6 小时前
学习与专注音乐流派 (Study & Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
大数据·人工智能·深度学习·学习·suno·suno api
爱写bug的野原新之助6 小时前
加密摘要算法MD5、SHA、HMAC:学习笔记
笔记·学习
ZH15455891317 小时前
Flutter for OpenHarmony Python学习助手实战:Web开发框架应用的实现
python·学习·flutter
Think_Higher7 小时前
广告投放术语一文解读 CPM CPC CPA OCPC OCPM OCPA
经验分享