|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | // | 
|  | // Supports writing a field that enables | 
|  | // a function within a module. | 
|  | // Requirements are that the function will | 
|  | // only be enabled when the field is written | 
|  | // the it is the inverse of the current field | 
|  | // setting. The can only toggle between the | 
|  | // the on value and the off value. | 
|  |  | 
|  |  | 
|  | module edn_field_en #( | 
|  | parameter int FieldW  = 4, | 
|  | parameter int FieldEnVal = 'ha | 
|  | ) ( | 
|  | input logic clk_i , | 
|  | input logic rst_ni, | 
|  | input logic               wvalid_i, | 
|  | input logic [FieldW-1:0]  wdata_i, | 
|  |  | 
|  | output logic              enable_o | 
|  | ); | 
|  |  | 
|  | // signal | 
|  | logic  field_update; | 
|  | logic [FieldW-1:0] field_value; | 
|  | logic [FieldW-1:0] field_value_invert; | 
|  |  | 
|  | // flops | 
|  | logic [FieldW-1:0] field_q, field_d; | 
|  |  | 
|  | assign  field_value = FieldEnVal; | 
|  | assign  field_value_invert = ~field_value; | 
|  |  | 
|  | always_ff @(posedge clk_i or negedge rst_ni) begin | 
|  | if (!rst_ni) begin | 
|  | field_q <= field_value_invert; | 
|  | end else begin | 
|  | field_q <= field_d; | 
|  | end | 
|  | end | 
|  |  | 
|  | assign field_update = wvalid_i && (field_q == ~wdata_i) && | 
|  | ((wdata_i == field_value) || | 
|  | (wdata_i == field_value_invert)); | 
|  |  | 
|  | assign field_d = field_update ? wdata_i : field_q; | 
|  |  | 
|  | assign enable_o = (field_q == field_value); | 
|  |  | 
|  |  | 
|  | endmodule |