OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_processor/] [mor1kx-5.0/] [rtl/] [verilog/] [mor1kx_pic.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/* ****************************************************************************
2
  This Source Code Form is subject to the terms of the
3
  Open Hardware Description License, v. 1.0. If a copy
4
  of the OHDL was not distributed with this file, You
5
  can obtain one at http://juliusbaxter.net/ohdl/ohdl.txt
6
 
7
  Description: mor1kx PIC
8
 
9
  Copyright (C) 2012 Authors
10
 
11
  Author(s): Julius Baxter <juliusbaxter@gmail.com>
12
 
13
***************************************************************************** */
14
 
15
`include "mor1kx-defines.v"
16
 
17
module mor1kx_pic
18
  (/*AUTOARG*/
19
   // Outputs
20
   spr_picmr_o, spr_picsr_o, spr_bus_ack, spr_dat_o,
21
   // Inputs
22
   clk, rst, irq_i, spr_access_i, spr_we_i, spr_addr_i, spr_dat_i
23
   );
24
 
25
   parameter OPTION_PIC_TRIGGER="LEVEL";
26
   parameter OPTION_PIC_NMI_WIDTH = 0;
27
 
28
   input clk;
29
   input rst;
30
 
31
   input [31:0] irq_i;
32
 
33
   output [31:0] spr_picmr_o;
34
   output [31:0] spr_picsr_o;
35
 
36
   // SPR Bus interface
37
   input         spr_access_i;
38
   input         spr_we_i;
39
   input [15:0]  spr_addr_i;
40
   input [31:0]  spr_dat_i;
41
   output        spr_bus_ack;
42
   output [31:0] spr_dat_o;
43
 
44
   // Registers
45
   reg [31:0]    spr_picmr;
46
   reg [31:0]    spr_picsr;
47
 
48
   wire spr_picmr_access;
49
   wire spr_picsr_access;
50
 
51
   wire [31:0]   irq_unmasked;
52
 
53
   assign spr_picmr_o = spr_picmr;
54
   assign spr_picsr_o = spr_picsr;
55
 
56
   assign spr_picmr_access =
57
     spr_access_i &
58
     (`SPR_OFFSET(spr_addr_i) == `SPR_OFFSET(`OR1K_SPR_PICMR_ADDR));
59
   assign spr_picsr_access =
60
     spr_access_i &
61
     (`SPR_OFFSET(spr_addr_i) == `SPR_OFFSET(`OR1K_SPR_PICSR_ADDR));
62
 
63
   assign spr_bus_ack = spr_access_i;
64
   assign spr_dat_o =  (spr_access_i & spr_picsr_access) ? spr_picsr :
65
                       (spr_access_i & spr_picmr_access) ? spr_picmr :
66
                       0;
67
 
68
   assign irq_unmasked = spr_picmr & irq_i;
69
 
70
   generate
71
 
72
      genvar     irqline;
73
 
74
      if (OPTION_PIC_TRIGGER=="EDGE") begin : edge_triggered
75
         reg [31:0] irq_unmasked_r;
76
         wire [31:0] irq_unmasked_edge;
77
 
78
         always @(posedge clk `OR_ASYNC_RST)
79
           if (rst)
80
             irq_unmasked_r <= 0;
81
           else
82
             irq_unmasked_r <= irq_unmasked;
83
 
84
         for(irqline=0;irqline<32;irqline=irqline+1)  begin: picgenerate
85
            assign irq_unmasked_edge[irqline] = irq_unmasked[irqline] &
86
                                                !irq_unmasked_r[irqline];
87
 
88
            // PIC status register
89
            always @(posedge clk `OR_ASYNC_RST)
90
              if (rst)
91
                spr_picsr[irqline] <= 0;
92
              // Set
93
              else if (irq_unmasked_edge[irqline])
94
                spr_picsr[irqline] <= 1;
95
              // Clear
96
              else if (spr_we_i & spr_picsr_access & spr_dat_i[irqline])
97
                spr_picsr[irqline] <= 0;
98
         end
99
      end else if (OPTION_PIC_TRIGGER=="LEVEL") begin : level_triggered
100
         for(irqline=0;irqline<32;irqline=irqline+1)
101
           begin: picsrlevelgenerate
102
              // PIC status register
103
              always @(*)
104
                spr_picsr[irqline] = irq_unmasked[irqline];
105
           end
106
      end // if (OPTION_PIC_TRIGGER=="LEVEL")
107
 
108
      else if (OPTION_PIC_TRIGGER=="LATCHED_LEVEL") begin : latched_level
109
         for(irqline=0;irqline<32;irqline=irqline+1)
110
           begin: piclatchedlevelgenerate
111
              // PIC status register
112
              always @(posedge clk `OR_ASYNC_RST)
113
                if (rst)
114
                  spr_picsr[irqline] <= 0;
115
                else if (spr_we_i && spr_picsr_access)
116
                  spr_picsr[irqline] <= irq_unmasked[irqline] |
117
                                               spr_dat_i[irqline];
118
                else
119
                  spr_picsr[irqline] <= spr_picsr[irqline] |
120
                                        irq_unmasked[irqline];
121
           end // block: picgenerate
122
      end // if (OPTION_PIC_TRIGGER=="EDGE")
123
 
124
      else begin : invalid
125
         initial begin
126
            $display("Error - invalid PIC level detection option %s",
127
                     OPTION_PIC_TRIGGER);
128
            $finish;
129
         end
130
      end // else: !if(OPTION_PIC_TRIGGER=="LEVEL")
131
   endgenerate
132
 
133
   // PIC (un)mask register
134
   always @(posedge clk `OR_ASYNC_RST)
135
     if (rst)
136
       spr_picmr <= {{(32-OPTION_PIC_NMI_WIDTH){1'b0}},
137
                     {OPTION_PIC_NMI_WIDTH{1'b1}}};
138
     else if (spr_we_i && spr_picmr_access)
139
       spr_picmr <= {spr_dat_i[31:OPTION_PIC_NMI_WIDTH],
140
                     {OPTION_PIC_NMI_WIDTH{1'b1}}};
141
 
142
endmodule // mor1kx_pic

powered by: WebSVN 2.1.0

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