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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [ds_dma64/] [pcie_src/] [pcie_core64_m1/] [source/] [tlm_rx_data_snk_pwr_mgmt.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
 
2
//-----------------------------------------------------------------------------
3
//
4
// (c) Copyright 2009-2010 Xilinx, Inc. All rights reserved.
5
//
6
// This file contains confidential and proprietary information
7
// of Xilinx, Inc. and is protected under U.S. and
8
// international copyright and other intellectual property
9
// laws.
10
//
11
// DISCLAIMER
12
// This disclaimer is not a license and does not grant any
13
// rights to the materials distributed herewith. Except as
14
// otherwise provided in a valid license issued to you by
15
// Xilinx, and to the maximum extent permitted by applicable
16
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
17
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
18
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
19
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
20
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
21
// (2) Xilinx shall not be liable (whether in contract or tort,
22
// including negligence, or under any other theory of
23
// liability) for any loss or damage of any kind or nature
24
// related to, arising under or in connection with these
25
// materials, including for any direct, or any indirect,
26
// special, incidental, or consequential loss or damage
27
// (including loss of data, profits, goodwill, or any type of
28
// loss or damage suffered as a result of any action brought
29
// by a third party) even if such damage or loss was
30
// reasonably foreseeable or Xilinx had been advised of the
31
// possibility of the same.
32
//
33
// CRITICAL APPLICATIONS
34
// Xilinx products are not designed or intended to be fail-
35
// safe, or for use in any application requiring fail-safe
36
// performance, such as life-support or safety devices or
37
// systems, Class III medical devices, nuclear facilities,
38
// applications related to the deployment of airbags, or any
39
// other applications that could lead to death, personal
40
// injury, or severe property or environmental damage
41
// (individually and collectively, "Critical
42
// Applications"). Customer assumes the sole risk and
43
// liability of any use of Xilinx products in Critical
44
// Applications, subject only to applicable laws and
45
// regulations governing limitations on product liability.
46
//
47
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
48
// PART OF THIS FILE AT ALL TIMES.
49
//
50
//-----------------------------------------------------------------------------
51
// Project    : V5-Block Plus for PCI Express
52
// File       : tlm_rx_data_snk_pwr_mgmt.v
53
//--------------------------------------------------------------------------------
54
//--------------------------------------------------------------------------------
55
/*****************************************************************************
56
 *  Description : Rx Data Sink power management packet interpretation
57
 *
58
 *     Hierarchical :
59
 *
60
 *     Functional :
61
 *      Removes power management packets from the stream and signals
62
 *        sideband to CMM
63
 *
64
 ****************************************************************************/
65
`timescale 1ns/1ps
66
`ifndef TCQ
67
 `define TCQ 1
68
`endif
69
 
70
`ifndef AS
71
module tlm_rx_data_snk_pwr_mgmt
72
  (
73
   input                 clk_i,
74
   input                 reset_i,
75
 
76
   // Power management signals for CMM
77
   output reg            pm_as_nak_l1_o,    // Pkt detected, implies src_rdy
78
   output reg            pm_turn_off_o,     // Pkt detected, implies src_rdy
79
   output reg            pm_set_slot_pwr_o, // Pkt detected, implies src_rdy
80
   output reg [9:0]      pm_set_slot_pwr_data_o, // value of field
81
   output reg            pm_msg_detect_o,   // grabbed a pm signal
82
 
83
   input                 ismsg_i,           // Packet data type
84
   input [7:0]           msgcode_i,         // message code
85
   input [9:0]           pwr_data_i,        // set slot value
86
   input                 eval_pwr_mgmt_i,   // grab the sideband fields
87
   input                 eval_pwr_mgmt_data_i, // get the data, if it exists
88
   input                 act_pwr_mgmt_i     // transmit the sideband fields
89
   );
90
 
91
  //-----------------------------------------------------------------------------
92
  // PCI Express constants
93
  //-----------------------------------------------------------------------------
94
  // Message code
95
  localparam             PM_ACTIVE_STATE_NAK       = 8'b0001_0100;
96
  localparam             PME_TURN_OFF              = 8'b0001_1001;
97
  localparam             SET_SLOT_POWER_LIMIT      = 8'b0101_0000;
98
 
99
  reg                    cur_pm_as_nak_l1;
100
  reg                    cur_pm_turn_off;
101
  reg                    cur_pm_set_slot_pwr;
102
 
103
  reg                    eval_pwr_mgmt_q1;
104
  reg                    eval_pwr_mgmt_data_q1;
105
  reg                    act_pwr_mgmt_q1;
106
 
107
  reg [9:0]              pm_set_slot_pwr_data_d1;
108
 
109
  // grab the fields at the beginning of the packet when known
110
  //----------------------------------------------------------
111
  always @(posedge clk_i) begin
112
    if (reset_i) begin
113
      cur_pm_as_nak_l1           <= #`TCQ 0;
114
      cur_pm_turn_off            <= #`TCQ 0;
115
      cur_pm_set_slot_pwr        <= #`TCQ 0;
116
    end else if (eval_pwr_mgmt_i) begin
117
      // ismsg is ANY message - malformed will are another modules
118
      // problem
119
      if (ismsg_i) begin
120
        cur_pm_as_nak_l1         <= #`TCQ (msgcode_i == PM_ACTIVE_STATE_NAK);
121
        cur_pm_turn_off          <= #`TCQ (msgcode_i == PME_TURN_OFF);
122
        cur_pm_set_slot_pwr      <= #`TCQ (msgcode_i == SET_SLOT_POWER_LIMIT);
123
 
124
      // if we aren't a mesg, these can't be true
125
      end else begin
126
        cur_pm_as_nak_l1         <= #`TCQ 0;
127
        cur_pm_turn_off          <= #`TCQ 0;
128
        cur_pm_set_slot_pwr      <= #`TCQ 0;
129
      end
130
    end
131
  end
132
 
133
  // We need to know which packets we're dropping because we're
134
  //   already signalling them sideband
135
  // pipelined due to timing
136
  //------------------------------------------------------
137
  always @(posedge clk_i) begin
138
    if (reset_i) begin
139
      pm_msg_detect_o            <= #`TCQ 0;
140
    end else if (eval_pwr_mgmt_q1) begin
141
      pm_msg_detect_o            <= #`TCQ cur_pm_as_nak_l1 ||
142
                                          cur_pm_turn_off  ||
143
                                          cur_pm_set_slot_pwr;
144
    end
145
  end
146
 
147
 
148
  // Data comes two cycles after the header fields, so we can't
149
  //   share the input latching fields
150
  // Furthermore, it will not go away until after eof_q2, so we
151
  //   can cheat on registers
152
  // Lastly, it does not imply activation, so we can always grab
153
  //   the field
154
  //-----------------------------------------------------------
155
  always @(posedge clk_i) begin
156
    if (eval_pwr_mgmt_data_i) begin
157
      pm_set_slot_pwr_data_d1 <= #`TCQ pwr_data_i;
158
    end
159
    if (eval_pwr_mgmt_data_q1) begin
160
      pm_set_slot_pwr_data_o  <= #`TCQ pm_set_slot_pwr_data_d1;
161
    end
162
  end
163
 
164
  // transmit sidebands when we know they are good for
165
  //   one cycle only
166
  always @(posedge clk_i) begin
167
    if (reset_i) begin
168
      pm_as_nak_l1_o         <= #`TCQ 0;
169
      pm_turn_off_o          <= #`TCQ 0;
170
      pm_set_slot_pwr_o      <= #`TCQ 0;
171
    // at this point, we know the packet is valid
172
    end else if (act_pwr_mgmt_i) begin
173
      pm_as_nak_l1_o         <= #`TCQ cur_pm_as_nak_l1;
174
      pm_turn_off_o          <= #`TCQ cur_pm_turn_off;
175
      pm_set_slot_pwr_o      <= #`TCQ cur_pm_set_slot_pwr;
176
    // implies src_rdy, return to zero
177
    end else if (act_pwr_mgmt_q1) begin
178
      pm_as_nak_l1_o         <= #`TCQ 0;
179
      pm_turn_off_o          <= #`TCQ 0;
180
      pm_set_slot_pwr_o      <= #`TCQ 0;
181
    end
182
  end
183
 
184
  // Also need delayed version
185
  always @(posedge clk_i) begin
186
    if (reset_i) begin
187
      eval_pwr_mgmt_q1           <= #`TCQ 0;
188
      eval_pwr_mgmt_data_q1      <= #`TCQ 0;
189
      act_pwr_mgmt_q1            <= #`TCQ 0;
190
    end else begin
191
      eval_pwr_mgmt_q1           <= #`TCQ eval_pwr_mgmt_i;
192
      eval_pwr_mgmt_data_q1      <= #`TCQ eval_pwr_mgmt_data_i;
193
      act_pwr_mgmt_q1            <= #`TCQ act_pwr_mgmt_i;
194
    end
195
  end
196
 
197
endmodule
198
`endif

powered by: WebSVN 2.1.0

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