⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitor.v

📁 一个用verilog编写的总线仲裁程序。多个设备共享总线
💻 V
字号:
module monitor(Gnt, Clk, chk_coverage);

input Clk, chk_coverage;
input [3:0]Gnt;

reg err_flag, pass_flag;
reg [4:0] chk_state;
reg [24:0] chk_trans;

event ERR_EVENT, PASS_EVENT;

initial 
begin
  chk_state <= 5'b0_0000;
  chk_trans <= 25'h000_0000;
  err_flag <= 1'b0;
  pass_flag <= 1'b0;
end

always @(negedge Clk)
case(arb_tb.myarb.myfsm.CurrentState)
  3'b000: chk_state <= chk_state | 5'b0_0001;
  3'b001: chk_state <= chk_state | 5'b0_0010;
  3'b010: chk_state <= chk_state | 5'b0_0100;
  3'b011: chk_state <= chk_state | 5'b0_1000;
  3'b100: chk_state <= chk_state | 5'b1_0000;
  default:
      begin
        $display("******ERROR-- Error State!", $time);
        ->ERR_EVENT;
      end
endcase

always @(posedge chk_coverage)
begin
  if(chk_state !== 5'b11111)
    begin
      $display("******>>>>>>>>>>>>>>>>ERROR-- STATE UNCOVERABLE!", $time);
      -> ERR_EVENT;
    end
  else
    begin
      $display(">>>>>>>>>>>>>>>>Pass-- STATE COVERAGE CORRECT, STATE=%b!", chk_state, $time);
      -> PASS_EVENT;
    end
end

always @(negedge Clk)
begin
  #2;
  case(arb_tb.myarb.myfsm.CurrentState)
  3'b000: case(arb_tb.myarb.myfsm.NextState)
          3'b000: chk_trans <= chk_trans | 25'h000_0001;
          3'b001: chk_trans <= chk_trans | 25'h000_0002;
          3'b010: chk_trans <= chk_trans | 25'h000_0004;
          3'b011: chk_trans <= chk_trans | 25'h000_0008;
          3'b100: chk_trans <= chk_trans | 25'h000_0010;
          default: begin
                  $display("******ERROR-- ARB NEXT STATE ERROR!", $time);
                  ->ERR_EVENT;
                  end
          endcase

  3'b001: case(arb_tb.myarb.myfsm.NextState)
          3'b000: chk_trans <= chk_trans | 25'h000_0020;
          3'b001: chk_trans <= chk_trans | 25'h000_0040;
          3'b010: chk_trans <= chk_trans | 25'h000_0080;
          3'b011: chk_trans <= chk_trans | 25'h000_0100;
          3'b100: chk_trans <= chk_trans | 25'h000_0200;
          default: begin
                  $display("******ERROR-- ARB NEXT STATE ERROR!", $time);
                  ->ERR_EVENT;
                  end
          endcase

  3'b010: case(arb_tb.myarb.myfsm.NextState)
          3'b000: chk_trans <= chk_trans | 25'h000_0400;
          3'b001: chk_trans <= chk_trans | 25'h000_0800;
          3'b010: chk_trans <= chk_trans | 25'h000_1000;
          3'b011: chk_trans <= chk_trans | 25'h000_2000;
          3'b100: chk_trans <= chk_trans | 25'h000_4000;
          default: begin
                  $display("******ERROR-- ARB NEXT STATE ERROR!", $time);
                  ->ERR_EVENT;
                  end
          endcase

  3'b011: case(arb_tb.myarb.myfsm.NextState)
          3'b000: chk_trans <= chk_trans | 25'h000_8000;
          3'b001: chk_trans <= chk_trans | 25'h001_0000;
          3'b010: chk_trans <= chk_trans | 25'h002_0000;
          3'b011: chk_trans <= chk_trans | 25'h004_0000;
          3'b100: chk_trans <= chk_trans | 25'h008_0000;
          default: begin
                  $display("******ERROR-- ARB NEXT STATE ERROR!", $time);
                  ->ERR_EVENT;
                  end
          endcase
    
  3'b100: case(arb_tb.myarb.myfsm.NextState)
          3'b000: chk_trans <= chk_trans | 25'h010_0000;
          3'b001: chk_trans <= chk_trans | 25'h020_0000;
          3'b010: chk_trans <= chk_trans | 25'h040_0000;
          3'b011: chk_trans <= chk_trans | 25'h080_0000;
          3'b100: chk_trans <= chk_trans | 25'h100_0000;
          default: begin
                  $display("******ERROR-- ARB NEXT STATE ERROR!", $time);
                  ->ERR_EVENT;
                  end
          endcase
  endcase
end


always @(posedge chk_coverage)
  if(chk_trans !== 25'h1ff_ffff)
    begin
      $display("******>>>>>>>>>>>>>>>>ERROR-- ARB STATE TRANSITION UNCOVERABLE, TRANS=%b!", chk_trans, $time);
      ->ERR_EVENT;
    end
  else
    begin
      $display(">>>>>>>>>>>>>>>>PASS-- ARB STATE TRANSITION COVERAGE CORRECT, TRANS=%b!", chk_trans, $time);
      ->PASS_EVENT;
    end

always @(negedge Clk)
  case (arb_tb.myarb.myfsm.CurrentState)
  3'b000: if((Gnt[0] !== 1'b0) || (Gnt[1] !== 1'b0) || (Gnt[2] !== 1'b0) || (Gnt[3] !== 1'b0))
            begin
              $display("******ERROR--GNT ERROR-- Gnt=%b", Gnt, $time);
              ->ERR_EVENT;
            end
          else
            begin
              $display("PASS--GNT CORRECT-- Gnt=%b", Gnt, $time);
              ->PASS_EVENT;
            end

  3'b001: if((Gnt[1] !== 1'b0) || (Gnt[2] !== 1'b0) || (Gnt[3] !== 1'b0))
            begin
              $display("******ERROR--GNT ERROR-- Gnt=%b", Gnt, $time);
              ->ERR_EVENT;
            end
          else
            begin
              $display("PASS--GNT CORRECT-- Gnt=%b", Gnt, $time);
              ->PASS_EVENT;
            end

  3'b010: if((Gnt[0] !== 1'b0) || (Gnt[2] !== 1'b0) || (Gnt[3] !== 1'b0))
            begin
              $display("******ERROR--GNT ERROR-- Gnt=%b", Gnt, $time);
              ->ERR_EVENT;
            end
          else
            begin
              $display("PASS--GNT CORRECT-- Gnt=%b", Gnt, $time);
              ->PASS_EVENT;
            end

  3'b011: if((Gnt[0] !== 1'b0) || (Gnt[1] !== 1'b0) || (Gnt[3] !== 1'b0))
            begin
              $display("******ERROR--GNT ERROR-- Gnt=%b", Gnt, $time);
              ->ERR_EVENT;
            end
          else
            begin
              $display("PASS--GNT CORRECT-- Gnt=%b", Gnt, $time);
              ->PASS_EVENT;
            end

  3'b100: if((Gnt[0] !== 1'b0) || (Gnt[1] !== 1'b0) || (Gnt[2] !== 1'b0))
            begin
              $display("******ERROR--GNT ERROR-- Gnt=%b", Gnt, $time);
              ->ERR_EVENT;
            end
          else
            begin
              $display("PASS--GNT CORRECT-- Gnt=%b", Gnt, $time);
              ->PASS_EVENT;
            end
  default: begin
            $display("******ERROR-- INVALID STATE!-- Gnt=%b", Gnt, $time);
            ->ERR_EVENT;
            end
  endcase


always @(negedge Clk)
  if((arb_tb.myarb.mycounter.gnt_done !== 1'b1) && 
     ((Gnt[0] !== 1'b0) || (Gnt[1] !== 1'b0) || (Gnt[2] !== 1'b0) || (Gnt[3] !== 1'b0)))
        begin
        $display("******ERROR-- GNT DEASSERATION ERROR!-- gnt_done=%b, Gnt=%b", 
                  arb_tb.myarb.mycounter.gnt_done , Gnt, $time);
        ->ERR_EVENT;
        end
  else
        begin
        $display("PASS-- GNT DEASSERATION CORRECT!-- gnt_done=%b, Gnt=%b", 
                  arb_tb.myarb.mycounter.gnt_done , Gnt, $time);

        ->PASS_EVENT;
        end

always @(negedge Clk)
  if(arb_tb.myarb.mycounter.gnt_done === 1'b1) 
    case(arb_tb.myarb.myfsm.CurrentState)
    3'b001: if(Gnt[0] !== 1'b1)
              begin
                $display("******ERROR-- GNT0 ASSERATION ERROR!",$time);
                ->ERR_EVENT;
              end
            else
              begin
                $display("PASS-- GNT0 ASSERATION CORRECT!",$time);
                ->PASS_EVENT;
              end
                
    3'b010: if(Gnt[1] !== 1'b1)
              begin
                $display("******ERROR-- GNT1 ASSERATION ERROR!",$time);
                ->ERR_EVENT;
              end
            else
              begin
                $display("PASS-- GNT1 ASSERATION CORRECT!",$time);
                ->PASS_EVENT;
              end

    3'b011: if(Gnt[2] !== 1'b1)
              begin
                $display("******ERROR-- GNT2 ASSERATION ERROR!",$time);
                ->ERR_EVENT;
              end
            else
              begin
                $display("***PASS-- GNT2 ASSERATION CORRECT!",$time);
                ->PASS_EVENT;
              end

    3'b100: if(Gnt[3] !== 1'b1)
              begin
                $display("******ERROR-- GNT3 ASSERATION ERROR!",$time);
                ->ERR_EVENT;
              end
            else
              begin
                $display("PASS-- GNT3 ASSERATION CORRECT!",$time);
                ->PASS_EVENT;
              end

//    default: begin
//                $display("******ERROR-- INVALID STATE %b !", arb_tb.myarb.myfsm.CurrentState, $time);
//                ->ERR_EVENT;
//              end
    endcase


always @(ERR_EVENT)
  begin
    err_flag <= 1'b1;
    #1;
    err_flag <= 1'b0;
  end

always @(PASS_EVENT)
  begin
    pass_flag <= 1'b1;
    #1;
    pass_flag <= 1'b0;
  end


endmodule


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -