OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [orpsocv2/] [boards/] [generic/] [ft/] [rtl/] [verilog/] [parity_err_handler/] [parity_err_handler.v] - Blame information for rev 483

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 483 julius
/*
2
 Parity error handler
3
 
4
 Vector of parity error indicating signals coming in.
5
 
6
 We issue reset if certain errors are spotted, and interrupt in the case of
7
 others.
8
 
9
 This module is not intended to be synthesisable, rather to be used in
10
 conjunction with the or1200_ft_stim testbench module.
11
 
12
 */
13
 
14
module parity_err_handler(
15
                          clk,
16
                          parity_err,
17
                          wb_rst,
18
                          reset,
19
                          interrupt,
20
                          wb_dat_o,
21
                          wb_ack_o,
22
                          wb_stb_i
23
                          );
24
   parameter parity_vector_width = 9;
25
   parameter parity_vector_resets = 1; // Signals at or below this we reset on
26
 
27
   input clk;
28
   input [parity_vector_width-1:0] parity_err;
29
   input                           wb_rst;
30
   output                          reset;
31
   output reg                      interrupt;
32
   output reg [7:0]                 wb_dat_o;
33
   output                          wb_ack_o;
34
   input                           wb_stb_i;
35
 
36
   reg                             reset_r;
37
 
38
   wire [parity_vector_width-1:0]  parity_err_mask;
39
 
40
   assign parity_err_mask = 9'b111100000;
41
 
42
   // Signal a reset if signals up to the number indicated by 
43
   // parity_vector_resets go high.
44
   always @(clk or wb_rst)
45
     if (wb_rst)
46
       reset_r <= 0;
47
     else
48
       casez(parity_err[parity_vector_width-1:0])
49
         //9'b????1????: reset_r <= 1;
50
         //9'b?????1???: reset_r <= 1;
51
         //9'b??????1??: reset_r <= 1;
52
         //9'b???????1?: reset_r <= 1;
53
         9'b????????1: reset_r <= 1;
54
         default: reset_r <= 0;
55
       endcase // casex (parity_err[parity_vector_resets-1:0])
56
 
57
   assign reset = reset_r;
58
 
59
   always @(posedge reset)
60
     $display("%m: Reset due to parity error. Vect:%h",parity_err);
61
 
62
 
63
   // Signal an interrupt if signals above number parity_vector_resets go high
64
   always @(posedge clk)
65
     begin
66
        if (wb_rst)
67
          interrupt <= 0;
68
        // Simulate level sensitive interrupt - clear upon read
69
        else if (parity_err[parity_vector_width-1:parity_vector_resets]
70
                 & ~parity_err_mask)
71
          interrupt <= 1;
72
        else if (wb_stb_i & wb_ack_o)
73
          interrupt <= 0;
74
     end
75
 
76
   assign wb_ack_o = wb_stb_i;
77
 
78
   // Data bus output to indicate which thing caused parity error
79
   always @(posedge clk)
80
     begin
81
        if (wb_rst)
82
          wb_dat_o <= 0;
83
        else if (parity_err[parity_vector_width-1:parity_vector_resets])
84
          wb_dat_o <= parity_err[parity_vector_width-1:parity_vector_resets];
85
        else if (wb_ack_o) // Clear data after read
86
          wb_dat_o <= 0;
87
     end
88
 
89
 
90
 
91
endmodule // parity_err_handler

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.