-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
38 changed files
with
12,610 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// Copyright lowRISC contributors. | ||
// Licensed under the Apache License, Version 2.0, see LICENSE for details. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
// This file is generated by the util/vendor script. Please do not modify it | ||
// manually. | ||
|
||
{ | ||
upstream: | ||
{ | ||
url: https://github.com/lowRISC/OpenTitan.git | ||
rev: 17f60494bd4c515b650d82711ee1ff9a9a979fdd | ||
only_subdir: hw/ip/prim | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// Copyright lowRISC contributors. | ||
// Licensed under the Apache License, Version 2.0, see LICENSE for details. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
// This file is generated by the util/vendor script. Please do not modify it | ||
// manually. | ||
|
||
{ | ||
upstream: | ||
{ | ||
url: https://github.com/lowRISC/OpenTitan.git | ||
rev: 17f60494bd4c515b650d82711ee1ff9a9a979fdd | ||
only_subdir: hw/ip/usbdev | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// Copyright lowRISC contributors. | ||
// Licensed under the Apache License, Version 2.0, see LICENSE for details. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
// This file is generated by the util/vendor script. Please do not modify it | ||
// manually. | ||
|
||
{ | ||
upstream: | ||
{ | ||
url: https://github.com/lowRISC/OpenTitan.git | ||
rev: 17f60494bd4c515b650d82711ee1ff9a9a979fdd | ||
only_subdir: hw/ip/usb_fs_nb_pe | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
// Copyright lowRISC contributors. | ||
// Licensed under the Apache License, Version 2.0, see LICENSE for details. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
// TODO: This module is a hard-coded stopgap to select an implementation of an | ||
// "abstract module". This module is to be replaced by generated code. | ||
|
||
|
||
`ifndef PRIM_DEFAULT_IMPL | ||
`define PRIM_DEFAULT_IMPL prim_pkg::ImplGeneric | ||
`endif | ||
|
||
module prim_ram_2p #( | ||
parameter prim_pkg::impl_e Impl = `PRIM_DEFAULT_IMPL, | ||
|
||
parameter int Width = 32, // bit | ||
parameter int Depth = 128, | ||
|
||
localparam int Aw = $clog2(Depth) // derived parameter | ||
) ( | ||
input clk_a_i, | ||
input clk_b_i, | ||
|
||
input a_req_i, | ||
input a_write_i, | ||
input [Aw-1:0] a_addr_i, | ||
input [Width-1:0] a_wdata_i, | ||
output logic [Width-1:0] a_rdata_o, | ||
|
||
input b_req_i, | ||
input b_write_i, | ||
input [Aw-1:0] b_addr_i, | ||
input [Width-1:0] b_wdata_i, | ||
output logic [Width-1:0] b_rdata_o | ||
); | ||
|
||
import prim_pkg::*; | ||
|
||
if (Impl == ImplGeneric) begin : gen_mem_generic | ||
prim_generic_ram_2p #( | ||
.Width(Width), | ||
.Depth(Depth) | ||
) u_impl_generic ( | ||
.clk_a_i, | ||
.clk_b_i, | ||
.a_req_i, | ||
.a_write_i, | ||
.a_addr_i, | ||
.a_wdata_i, | ||
.a_rdata_o, | ||
.b_req_i, | ||
.b_write_i, | ||
.b_addr_i, | ||
.b_wdata_i, | ||
.b_rdata_o | ||
); | ||
end else if (Impl == ImplXilinx) begin : gen_mem_xilinx | ||
prim_xilinx_ram_2p #( | ||
.Width(Width), | ||
.Depth(Depth) | ||
) u_impl_xilinx ( | ||
.clk_a_i, | ||
.clk_b_i, | ||
.a_req_i, | ||
.a_write_i, | ||
.a_addr_i, | ||
.a_wdata_i, | ||
.a_rdata_o, | ||
.b_req_i, | ||
.b_write_i, | ||
.b_addr_i, | ||
.b_wdata_i, | ||
.b_rdata_o | ||
); | ||
end else begin : gen_failure | ||
// TODO: Find code that works across tools and causes a compile failure | ||
end | ||
|
||
endmodule |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
// Copyright lowRISC contributors. | ||
// Licensed under the Apache License, Version 2.0, see LICENSE for details. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
# Copyright lowRISC contributors. | ||
# Licensed under the Apache License, Version 2.0, see LICENSE for details. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
# | ||
# waiver file for prim | ||
|
||
# prim_fifo_sync | ||
waive -rules {ONE_BIT_MEM_WIDTH} -location {prim_fifo_sync.sv} -msg {Memory 'gen_normal_fifo.storage' has word width which is single bit wide} \ | ||
-comment "It is permissible that a FIFO has a wordwidth of 1bit" | ||
|
||
# prim_fifo_async | ||
waive -rules {ASSIGN_SIGN} -location {prim_fifo_async.sv} -msg {Signed target 'i' assigned unsigned value 'PTR_WIDTH - 3'} \ | ||
-comment "Parameter PTR_WIDTH is unsigned, but integer i is signed. This is fine. Changing the integer to unsigned might \ | ||
cause issues with the for loop never exiting, because an unsigned integer can never become < 0." | ||
|
||
# prim_ram_2p_adv | ||
waive -rules {INPUT_NOT_READ} -location {prim_ram_2p_adv.sv} -msg {Input port 'cfg_i' is not read from in module} \ | ||
-comment "We will eventually use this input for RTC/WTC or other memory parameters." | ||
|
||
# prim_assert | ||
waive -rules {UNDEF_MACRO_REF} -location {prim_assert.sv} -regexp {Macro definition for 'ASSERT_RPT' includes expansion of undefined macro '__(FILE|LINE)__'} \ | ||
-comment "This is an UVM specific macro inside our assertion shortcuts" | ||
|
||
# prim_packer | ||
waive -rules INTEGER -location {prim_packer.sv} -msg {'i' of type int used as a non-constant value} \ | ||
-comment "This assigns int i (signed) to a multibit logic variable (unsigned), which is fine" | ||
|
||
# primitives: prim_subreg | ||
|
||
waive -rules INPUT_NOT_READ -location {prim_subreg.sv} -regexp {Input port 'wd' is not read from} \ | ||
-comment "for RO wd is not used" | ||
|
||
# primitives: prim_arbiter_* | ||
|
||
waive -rules PARTIAL_CONST_ASSIGN -location {prim_arbiter_*.sv} -regexp {'mask.0.' is conditionally assigned a constant} \ | ||
-comment "makes the code more readable" | ||
waive -rules CONST_FF -location {prim_arbiter_*.sv} -regexp {Flip-flop 'mask.0.' is driven by constant} \ | ||
-comment "makes the code more readable" | ||
|
||
# primitives: prim_sram_arbiter | ||
waive -rules CONST_OUTPUT -location {prim_sram_arbiter.sv} -regexp {rsp_error.* is driven by constant} \ | ||
-comment "SRAM protection is not yet implemented" | ||
|
||
# primitives: prim_fifos | ||
|
||
waive -rules VAR_INDEX_RANGE -location {prim_fifo_*sync.sv} -regexp {maximum value .* may be too large for 'storage'} \ | ||
-comment "index is protected by control logic" | ||
waive -rules EXPLICIT_BITLEN -location {prim_fifo_*sync.sv} -regexp {Bit length not specified for constant '1'} \ | ||
-comment "index is protected by control logic" | ||
waive -rules NOT_READ -location {prim_fifo_async.sv} -regexp {Signal 'nc_decval_msb' is not read} \ | ||
-comment "Store temporary values. Not used intentionally" | ||
|
||
waive -rules {INPUT_NOT_READ} -location {prim_fifo_sync.sv} -regexp {Input port '(clk_i|rst_ni)' is not read from, instance.*Depth=0\)} \ | ||
-comment "In passthrough mode, clk and reset are not read form within this module" | ||
|
||
# TL-UL fifo | ||
waive -rules {HIER_BRANCH_NOT_READ} -location {tlul_fifo_sync.sv} -regexp {Connected net '(clk_i|rst_ni)' at prim_fifo_sync.sv:.* is not read from in module 'prim_fifo_sync'} \ | ||
-comment "In passthrough mode, clk and reset are not read form within this module" | ||
|
||
# primitivies: prim_ram_2p_wrapper | ||
# | ||
#waive -rules INPUT_NOT_READ -location {prim_ram_*_wrapper*} -regexp {cfg_i} \ | ||
# -comment "Register model doesn't need config port" | ||
#waive -rules NOT_READ -location {prim_ram_*_wrapper*} -regexp {(a|b)_rdata_(q|d)\[38} \ | ||
# -comment "Syndrome is not going out to the interface" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,185 @@ | ||
// Copyright lowRISC contributors. | ||
// Licensed under the Apache License, Version 2.0, see LICENSE for details. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
// Macros and helper code for using assertions. | ||
// - Provides default clk and rst options to simplify code | ||
// - Provides boiler plate template for common assertions | ||
|
||
`ifndef PRIM_ASSERT_SV | ||
`define PRIM_ASSERT_SV | ||
|
||
`ifdef UVM | ||
// report assertion error with UVM if compiled | ||
package assert_rpt_pkg; | ||
import uvm_pkg::*; | ||
`include "uvm_macros.svh" | ||
function void assert_rpt(string msg); | ||
`uvm_error("ASSERT FAILED", msg) | ||
endfunction | ||
endpackage | ||
`endif | ||
|
||
/////////////////// | ||
// Helper macros // | ||
/////////////////// | ||
|
||
// local helper macro to reduce code clutter. undefined at the end of this file | ||
`ifndef VERILATOR | ||
`ifndef SYNTHESIS | ||
`define INC_ASSERT | ||
`endif | ||
`endif | ||
|
||
// Converts an arbitrary block of code into a Verilog string | ||
`define PRIM_STRINGIFY(__x) `"__x`" | ||
|
||
// ASSERT_RPT is available to change the reporting mechanism when an assert fails | ||
`define ASSERT_RPT(__name, __msg) \ | ||
`ifdef UVM \ | ||
assert_rpt_pkg::assert_rpt($sformatf("[%m] %s: %s (%s:%0d)", \ | ||
__name, __msg, `__FILE__, `__LINE__)); \ | ||
`else \ | ||
$error("[ASSERT FAILED] [%m] %s: %s", __name, __msg); \ | ||
`endif | ||
|
||
/////////////////////////////////////// | ||
// Simple assertion and cover macros // | ||
/////////////////////////////////////// | ||
|
||
// Default clk and reset signals used by assertion macros below. | ||
`define ASSERT_DEFAULT_CLK clk_i | ||
`define ASSERT_DEFAULT_RST !rst_ni | ||
|
||
// Immediate assertion | ||
// Note that immediate assertions are sensitive to simulation glitches. | ||
`define ASSERT_I(__name, __prop) \ | ||
`ifdef INC_ASSERT \ | ||
__name: assert (__prop) \ | ||
else `ASSERT_RPT(`PRIM_STRINGIFY(__name), `PRIM_STRINGIFY(__prop)) \ | ||
`endif | ||
|
||
// Assertion in initial block. Can be used for things like parameter checking. | ||
`define ASSERT_INIT(__name, __prop) \ | ||
`ifdef INC_ASSERT \ | ||
initial \ | ||
__name: assert (__prop) \ | ||
else `ASSERT_RPT(`PRIM_STRINGIFY(__name), `PRIM_STRINGIFY(__prop)) \ | ||
`endif | ||
|
||
// Assertion in final block. Can be used for things like queues being empty | ||
// at end of sim, all credits returned at end of sim, state machines in idle | ||
// at end of sim. | ||
`define ASSERT_FINAL(__name, __prop) \ | ||
`ifdef INC_ASSERT \ | ||
final \ | ||
__name: assert (__prop || $test$plusargs("disable_assert_final_checks")) \ | ||
else `ASSERT_RPT(`PRIM_STRINGIFY(__name), `PRIM_STRINGIFY(__prop)) \ | ||
`endif | ||
|
||
// Assert a concurrent property directly. | ||
// It can be called as a module (or interface) body item. | ||
`define ASSERT(__name, __prop, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef INC_ASSERT \ | ||
__name: assert property (@(posedge __clk) disable iff (__rst !== '0) (__prop)) \ | ||
else `ASSERT_RPT(`PRIM_STRINGIFY(__name), `PRIM_STRINGIFY(__prop)) \ | ||
`endif | ||
// Note: Above we use (__rst !== '0) in the disable iff statements instead of | ||
// (__rst == '1). This properly disables the assertion in cases when reset is X at | ||
// the beginning of a simulation. For that case, (reset == '1) does not disable the | ||
// assertion. | ||
|
||
// Assert a concurrent property NEVER happens | ||
`define ASSERT_NEVER(__name, __prop, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef INC_ASSERT \ | ||
__name: assert property (@(posedge __clk) disable iff (__rst !== '0) not (__prop)) \ | ||
else `ASSERT_RPT(`PRIM_STRINGIFY(__name), `PRIM_STRINGIFY(__prop)) \ | ||
`endif | ||
|
||
// Assert that signal has a known value (each bit is either '0' or '1') after reset. | ||
// It can be called as a module (or interface) body item. | ||
`define ASSERT_KNOWN(__name, __sig, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef INC_ASSERT \ | ||
`ASSERT(__name, !$isunknown(__sig), __clk, __rst) \ | ||
`endif | ||
|
||
// Cover a concurrent property | ||
`define COVER(__name, __prop, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef INC_ASSERT \ | ||
__name: cover property (@(posedge __clk) disable iff (__rst !== '0) (__prop)); \ | ||
`endif | ||
|
||
////////////////////////////// | ||
// Complex assertion macros // | ||
////////////////////////////// | ||
|
||
// Assert that signal is an active-high pulse with pulse length of 1 clock cycle | ||
`define ASSERT_PULSE(__name, __sig, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef INC_ASSERT \ | ||
`ASSERT(__name, $rose(__sig) |=> !(__sig), __clk, __rst) \ | ||
`endif | ||
|
||
// Assert that valid is known after reset and data is known when valid == 1 | ||
`define ASSERT_VALID_DATA \ | ||
(__name, __valid, __dat, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef INC_ASSERT \ | ||
`ASSERT_KNOWN(__name``KnownValid, __valid, __clk, __rst) \ | ||
`ASSERT_NEVER(__name``KnownData, (__valid) && $isunknown(__dat), __clk, __rst) \ | ||
`endif | ||
|
||
// Same as ASSERT_VALID_DATA, but also assert that ready is known after reset | ||
`define ASSERT_VALID_READY_DATA \ | ||
(__name, __valid, __ready, __dat, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef INC_ASSERT \ | ||
`ASSERT_KNOWN(__name``KnownValid, __valid, __clk, __rst) \ | ||
`ASSERT_KNOWN(__name``KnownReady, __ready, __clk, __rst) \ | ||
`ASSERT_NEVER(__name``KnownData, (__valid) && $isunknown(__dat), __clk, __rst) \ | ||
`endif | ||
|
||
/////////////////////// | ||
// Assumption macros // | ||
/////////////////////// | ||
|
||
// Assume a concurrent property | ||
`define ASSUME(__name, __prop, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef INC_ASSERT \ | ||
__name: assume property (@(posedge __clk) disable iff (__rst !== '0) (__prop)) \ | ||
else begin `ASSERT_RPT(`PRIM_STRINGIFY(__name), `PRIM_STRINGIFY(__prop)) end \ | ||
`endif | ||
|
||
// Assume an immediate property | ||
`define ASSUME_I(__name, __prop) \ | ||
`ifdef INC_ASSERT \ | ||
__name: assume (__prop) \ | ||
else `ASSERT_RPT(`PRIM_STRINGIFY(__name), `PRIM_STRINGIFY(__prop)) \ | ||
`endif | ||
|
||
////////////////////////////////// | ||
// For formal verification only // | ||
////////////////////////////////// | ||
|
||
// Note that the existing set of ASSERT macros specified above shall be used for FPV, | ||
// thereby ensuring that the assertions are evaluated during DV simulations as well. | ||
|
||
// ASSUME_FPV | ||
// Assume a concurrent property during formal verification only. | ||
`define ASSUME_FPV(__name, __prop, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef FPV_ON \ | ||
`ASSUME(__name, __prop, __clk, __rst) \ | ||
`endif | ||
|
||
// ASSUME_I_FPV | ||
// Assume a concurrent property during formal verification only. | ||
`define ASSUME_I_FPV(__name, __prop) \ | ||
`ifdef FPV_ON \ | ||
`ASSUME_I(__name, __prop) \ | ||
`endif | ||
|
||
// COVER_FPV | ||
// Cover a concurrent property during formal verification | ||
`define COVER_FPV(__name, __prop, __clk = `ASSERT_DEFAULT_CLK, __rst = `ASSERT_DEFAULT_RST) \ | ||
`ifdef FPV_ON \ | ||
`COVER(__name, __prop, __clk, __rst) \ | ||
`endif | ||
|
||
`endif // PRIM_ASSERT_SV |
Oops, something went wrong.