Skip to content

Commit 71683aa

Browse files
GregACmarnovandermaas
authored andcommitted
Update lowrisc_ip to lowRISC/opentitan@e0c4026501
Update code from upstream repository https://github.com/lowRISC/opentitan to revision e0c40265019aa0c74e6903d3b3a144c48a3815ec * [prim/lint] Fix long line lint error in prim_intr_hw (Alexander Williams) * [csr_seq_lib] Avoid slicing a queue (Rupert Swarbrick) * [dv] Make mem_model's compare_byte function less chatty (Rupert Swarbrick) * [doc,prim] Improve comments in prim_intr_hw (Harry Callahan) * [dvsim] Format FormalCfg code. (Miguel Osorio) * [dvsim] Add results_server dependency to FormalCfg (Miguel Osorio) * [prim_sha2] Add `hash_running_o` (Andreas Kurth) * [prim_sha2] Add `hash_continue_i` (Andreas Kurth) * [prim_sha2] Make digest writable from input while disabled (Andreas Kurth) * [dv,random_reset] Enhance handling of random resets (Guillermo Maturana) * [dv] Change implementation of special mubi access modes (Michael Schaffner) * [dv,cov_merge] Do serial coverage merge for vcs (Guillermo Maturana) * [dv/csr_utils] Change csr_peek to return the peeked value (Rupert Swarbrick) * [dv/csr_utils] Expand a documentation comment in csr_peek (Rupert Swarbrick) * [dv/csr_utils] Simplify HDL path checking in csr_peek (Rupert Swarbrick) * [dv/csr_utils] Use DV_CHECK to simplify code structure in csr_peek (Rupert Swarbrick) * [dv/csr_utils] Fix a seeming typo in csr_peek (Rupert Swarbrick) * [dv/csr_utils] Change `csr_peek` to function (Andreas Kurth) * [prim] Fix lint error in shadow register subreg primitive (Pirmin Vogel) * [otp_ctrl] Add second HW_CFG partition (Michael Schaffner) * [primgen] Fix parameters in a primgen template (Rupert Swarbrick) * [prim] Avoid unnecessary Impl parameter in prim_onehot_check (Rupert Swarbrick) * [hw,prim,sha2] Fix syntax error in waiver file (Robert Schilling) * [prim_sha2,rtl] prim_sha2 minor RTL and styling fixes (Ghada Dessouky) * [prim_sha2,rtl] Add RTL implementation + update core + lint waivers (Ghada Dessouky) * [otp_ctrl] Remove entropy_src chicken switches (Michael Schaffner) * [dv] Correct direct prediction of regwen (Michael Schaffner) * [clkmgr] Restructure division clock feedback (Michael Schaffner) * Revert "[edn] Move prim_edn_req out of prim" (Rupert Swarbrick) * [rtl, prim] Add 'commit' functionality to prim_count (Greg Chadwick) * [prim] Fix up 1r1w cores (Alexander Williams) * [prim] Add two-port memory ECC wrappers (Michael Schaffner) * [prim] Add two-port memory implementation (Michael Schaffner) * [prim] Make copies of dual port memory files (Michael Schaffner) * [otp_ctrl] Add support for multiple HW_CFG partitions (Michael Schaffner) * [otp_ctrl] Add option to disable integrity on a partition (Michael Schaffner) * [dv] Enhance RAL model with clearable mubi types (Michael Schaffner) Signed-off-by: Greg Chadwick <[email protected]>
1 parent 5a8a1a9 commit 71683aa

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2686
-156
lines changed

vendor/lowrisc_ip.lock.hjson

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
upstream:
1010
{
1111
url: https://github.com/lowRISC/opentitan
12-
rev: 4cf2479b8e6c9b68b9fe1adba202443d3dbe3ff3
12+
rev: e0c40265019aa0c74e6903d3b3a144c48a3815ec
1313
}
1414
}

vendor/lowrisc_ip/dv/sv/csr_utils/csr_seq_lib.sv

+5-4
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,13 @@ class csr_base_seq extends uvm_reg_sequence #(uvm_sequence #(uvm_reg_item));
8888
end_idx = test_csr_chunk * chunk_size;
8989
if (end_idx >= all_csrs.size()) end_idx = all_csrs.size() - 1;
9090

91-
test_csrs = all_csrs[start_idx:end_idx];
9291
`uvm_info(`gtn, $sformatf("Testing %0d csrs [%0d - %0d] in all supplied models.",
9392
test_csrs.size(), start_idx, end_idx), UVM_MEDIUM)
94-
foreach (test_csrs[i]) begin
95-
`uvm_info(`gtn, $sformatf("Testing CSR %0s, reset: 0x%0x.", test_csrs[i].get_full_name(),
96-
test_csrs[i].get_mirrored_value()), UVM_HIGH)
93+
test_csrs.delete();
94+
for (int i = start_idx; i <= end_idx; i++) begin
95+
test_csrs.push_back(all_csrs[i]);
96+
`uvm_info(`gtn, $sformatf("Testing CSR %0s, reset: 0x%0x.", all_csrs[i].get_full_name(),
97+
all_csrs[i].get_mirrored_value()), UVM_HIGH)
9798
end
9899
test_csrs.shuffle();
99100
endfunction

vendor/lowrisc_ip/dv/sv/csr_utils/csr_utils_pkg.sv

+32-27
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ package csr_utils_pkg;
340340
input uvm_reg_map map = null,
341341
input uvm_reg_frontdoor user_ftdr = default_user_frontdoor);
342342
if (backdoor) begin
343-
csr_peek(ptr, value, check);
343+
value = csr_peek(ptr, check);
344344
status = UVM_IS_OK;
345345
return;
346346
end
@@ -383,35 +383,40 @@ package csr_utils_pkg;
383383

384384
// backdoor read csr
385385
// uvm_reg::peek() returns a 2-state value, directly get data from hdl path
386-
task automatic csr_peek(input uvm_object ptr,
387-
output uvm_reg_data_t value,
388-
input uvm_check_e check = default_csr_check,
389-
input bkdr_reg_path_e kind = BkdrRegPathRtl);
390-
string msg_id = {csr_utils_pkg::msg_id, "::csr_peek"};
391-
csr_field_t csr_or_fld = decode_csr_or_field(ptr);
392-
uvm_reg csr = csr_or_fld.csr;
393-
394-
if (csr.has_hdl_path(kind.name)) begin
395-
uvm_hdl_path_concat paths[$];
396-
397-
csr.get_full_hdl_path(paths, kind.name);
398-
foreach (paths[0].slices[i]) begin
399-
uvm_reg_data_t field_val;
400-
if (uvm_hdl_read(paths[0].slices[i].path, field_val)) begin
401-
if (check == UVM_CHECK) `DV_CHECK_EQ($isunknown(value), 0, "", error, msg_id)
402-
value |= field_val << paths[0].slices[i].offset;
403-
end else begin
404-
`uvm_fatal(msg_id, $sformatf("uvm_hdl_read failed for %0s", csr.get_full_name()))
405-
end
406-
end
407-
end else begin
408-
`uvm_fatal(msg_id, $sformatf("No backdoor defined for %0s path's %0s",
409-
csr.get_full_name(), kind.name))
386+
function automatic uvm_reg_data_t csr_peek(uvm_object ptr,
387+
uvm_check_e check = default_csr_check,
388+
bkdr_reg_path_e kind = BkdrRegPathRtl);
389+
string msg_id = {csr_utils_pkg::msg_id, "::csr_peek"};
390+
csr_field_t csr_or_fld = decode_csr_or_field(ptr);
391+
uvm_reg csr = csr_or_fld.csr;
392+
uvm_reg_data_t value = 0;
393+
394+
uvm_hdl_path_concat paths[$];
395+
csr.get_full_hdl_path(paths, kind.name);
396+
397+
`DV_CHECK_FATAL(paths.size() > 0,
398+
$sformatf("No backdoor defined for %0s path's %0s",
399+
csr.get_full_name(), kind.name),
400+
msg_id)
401+
402+
foreach (paths[0].slices[i]) begin
403+
uvm_reg_data_t field_val;
404+
`DV_CHECK_FATAL(uvm_hdl_read(paths[0].slices[i].path, field_val),
405+
$sformatf("Failed to read %s, slice %d, at path %s",
406+
csr.get_full_name(), i, paths[0].slices[i].path),
407+
msg_id)
408+
if (check == UVM_CHECK) `DV_CHECK_EQ($isunknown(field_val), 0, "", error, msg_id)
409+
410+
value |= field_val << paths[0].slices[i].offset;
410411
end
411412

412-
// if it's field, only return field value
413+
// We now have the contents of the field or register in value. If ptr was a sub-field of some
414+
// register, it will be laid out in the same way as the field is laid out in the register.
415+
// That's no problem: we can just extract the relevant field from the laid-out value here.
413416
if (csr_or_fld.field != null) value = get_field_val(csr_or_fld.field, value);
414-
endtask
417+
418+
return value;
419+
endfunction
415420

416421
task automatic csr_rd_check(input uvm_object ptr,
417422
input uvm_check_e check = default_csr_check,

vendor/lowrisc_ip/dv/sv/dv_base_reg/dv_base_reg.sv

+14-3
Original file line numberDiff line numberDiff line change
@@ -305,14 +305,15 @@ class dv_base_reg extends uvm_reg;
305305
end
306306
do_update_shadow_vals = 0;
307307
end
308-
lock_lockable_flds(rw.value[0]);
308+
lock_lockable_flds(rw.value[0], kind);
309309
endfunction
310310

311311
// This function is used for wen_reg to lock its lockable flds by changing the lockable flds'
312312
// access policy. For register write via csr_wr(), this function is included in post_write().
313313
// For register write via tl_access(), user will need to call this function manually.
314-
virtual function void lock_lockable_flds(uvm_reg_data_t val);
314+
virtual function void lock_lockable_flds(uvm_reg_data_t val, uvm_predict_e kind);
315315
if (is_wen_reg()) begin
316+
`uvm_info(`gfn, $sformatf("lock_lockable_flds %d val", val), UVM_LOW);
316317
foreach (m_fields[i]) begin
317318
dv_base_reg_field fld;
318319
`downcast(fld, m_fields[i])
@@ -322,7 +323,17 @@ class dv_base_reg extends uvm_reg;
322323
case (field_access)
323324
// discussed in issue #1922: enable register is standarized to W0C or RO (if HW has
324325
// write access).
325-
"W0C": if (field_val == 1'b0) fld.set_lockable_flds_access(1);
326+
"W0C": begin
327+
// This is the regular behavior with W0C access policy enabled (i.e., only
328+
// clearing is possible).
329+
if (kind == UVM_PREDICT_WRITE && field_val == 1'b0) begin
330+
fld.set_lockable_flds_access(1);
331+
// In this case we are using direct prediction where the access policy is not
332+
// applied. I.e., a regwen bit that has been set to 0 can be set to 1 again.
333+
end else if (kind == UVM_PREDICT_DIRECT) begin
334+
fld.set_lockable_flds_access((~field_val) & fld.get_field_mask());
335+
end
336+
end
326337
"RO": ; // if RO, it's updated by design, need to predict in scb
327338
default:`uvm_fatal(`gfn, $sformatf("lock register invalid access %s", field_access))
328339
endcase

vendor/lowrisc_ip/dv/sv/dv_base_reg/dv_base_reg_field.sv

+70-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ class dv_base_reg_field extends uvm_reg_field;
1717
// This is used for get_field_by_name
1818
string alias_name = "";
1919

20+
// If this field encodes a mubi, this field encodes special access modes such as W1C that cannot
21+
// be captured with the regular access configuration, since UVM does not model such access modes
22+
// correctly for mubis.
23+
string mubi_access = "";
24+
2025
// Default mubi_width = 0 indicates this register field is not a mubi type.
2126
protected int mubi_width;
2227

@@ -58,6 +63,7 @@ class dv_base_reg_field extends uvm_reg_field;
5863
int unsigned size,
5964
int unsigned lsb_pos,
6065
string access,
66+
string mubi_access,
6167
bit volatile,
6268
uvm_reg_data_t reset,
6369
bit has_reset,
@@ -73,7 +79,7 @@ class dv_base_reg_field extends uvm_reg_field;
7379
.is_rand (is_rand),
7480
.individually_accessible(individually_accessible));
7581
value.rand_mode(is_rand);
76-
82+
this.mubi_access = mubi_access;
7783
is_intr_test_fld = !(uvm_re_match("intr_test*", get_parent().get_name()));
7884
shadowed_val = ~committed_val;
7985
endfunction
@@ -83,10 +89,53 @@ class dv_base_reg_field extends uvm_reg_field;
8389
`downcast(get_dv_base_reg_parent, csr)
8490
endfunction
8591

92+
// Local helper function to reduce code in do_predict further below.
93+
function uvm_reg_data_t mubi_or_hi (uvm_reg_data_t a, uvm_reg_data_t b);
94+
import prim_mubi_pkg::*;
95+
uvm_reg_data_t out;
96+
case (mubi_width)
97+
4: out = uvm_reg_data_t'(mubi4_or_hi(mubi4_t'(a), mubi4_t'(b)));
98+
8: out = uvm_reg_data_t'(mubi8_or_hi(mubi8_t'(a), mubi8_t'(b)));
99+
12: out = uvm_reg_data_t'(mubi12_or_hi(mubi12_t'(a), mubi12_t'(b)));
100+
16: out = uvm_reg_data_t'(mubi16_or_hi(mubi16_t'(a), mubi16_t'(b)));
101+
default: $error("Unsupported mubi width %d.", mubi_width);
102+
endcase
103+
return out;
104+
endfunction: mubi_or_hi
105+
106+
// Local helper function to reduce code in do_predict further below.
107+
function uvm_reg_data_t mubi_and_hi (uvm_reg_data_t a, uvm_reg_data_t b);
108+
import prim_mubi_pkg::*;
109+
uvm_reg_data_t out;
110+
case (mubi_width)
111+
4: out = uvm_reg_data_t'(mubi4_and_hi(mubi4_t'(a), mubi4_t'(b)));
112+
8: out = uvm_reg_data_t'(mubi8_and_hi(mubi8_t'(a), mubi8_t'(b)));
113+
12: out = uvm_reg_data_t'(mubi12_and_hi(mubi12_t'(a), mubi12_t'(b)));
114+
16: out = uvm_reg_data_t'(mubi16_and_hi(mubi16_t'(a), mubi16_t'(b)));
115+
default: $error("Unsupported mubi width: %d.", mubi_width);
116+
endcase
117+
return out;
118+
endfunction: mubi_and_hi
119+
120+
// Local helper function to reduce code in do_predict further below.
121+
function uvm_reg_data_t mubi_false ();
122+
import prim_mubi_pkg::*;
123+
uvm_reg_data_t out;
124+
case (mubi_width)
125+
4: out = uvm_reg_data_t'(MuBi4False);
126+
8: out = uvm_reg_data_t'(MuBi8False);
127+
12: out = uvm_reg_data_t'(MuBi12False);
128+
16: out = uvm_reg_data_t'(MuBi16False);
129+
default: $error("Unsupported mubi width: %d.", mubi_width);
130+
endcase
131+
return out;
132+
endfunction: mubi_false
133+
86134
virtual function void do_predict (uvm_reg_item rw,
87135
uvm_predict_e kind = UVM_PREDICT_DIRECT,
88136
uvm_reg_byte_en_t be = -1);
89137
uvm_reg_data_t field_val = rw.value[0] & ((1 << get_n_bits())-1);
138+
string access = get_access();
90139

91140
// update intr_state mirrored value if this is an intr_test reg
92141
// if kind is UVM_PREDICT_DIRECT or UVM_PREDICT_READ, super.do_predict can handle
@@ -101,8 +150,27 @@ class dv_base_reg_field extends uvm_reg_field;
101150
end
102151
// use UVM_PREDICT_READ to avoid uvm_warning due to UVM_PREDICT_DIRECT
103152
void'(intr_state_fld.predict(predict_val, .kind(UVM_PREDICT_READ)));
104-
end
105153

154+
end else if (kind == UVM_PREDICT_WRITE && mubi_access inside {"W1S", "W1C", "W0C"})
155+
begin
156+
// Some smoke checking of the byte enables. RTL does not latch anything if not all affected
157+
// bytes of the field are enabled. Note that we still use UVM_PREDICT_WRITE further below
158+
// since the underlying access is set to RW in the RAL model.
159+
if (mubi_width <= 8 && be[0] || mubi_width > 8 && mubi_width <= 16 && &be[1:0]) begin
160+
// In case this is a clearable MUBI field, we have to interpret the write value correctly.
161+
// ICEBOX(#9273): Note that this just uses bitwise functions to update the value and does
162+
// not rectify incorrect mubi values. At a later point, we should discuss if and how to
163+
// tighten this up, as discussed on the linked issue.
164+
case (mubi_access)
165+
"W1S": rw.value[0] = this.mubi_or_hi(rw.value[0], `gmv(this));
166+
"W1C": rw.value[0] = this.mubi_and_hi(~rw.value[0], `gmv(this));
167+
"W0C": rw.value[0] = this.mubi_and_hi(rw.value[0], `gmv(this));
168+
default: ; // unreachable
169+
endcase
170+
end
171+
end else if (kind == UVM_PREDICT_READ && mubi_access == "RC") begin
172+
rw.value[0] = this.mubi_false();
173+
end
106174
super.do_predict(rw, kind, be);
107175
endfunction
108176

vendor/lowrisc_ip/dv/sv/dv_lib/dv_base_env_cfg.sv

+15
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class dv_base_env_cfg #(type RAL_T = dv_base_reg_block) extends uvm_object;
1212
bit en_cov = 0; // Enable via plusarg, only if coverage collection is turned on.
1313
bit en_dv_cdc = 0; // Enable via plusarg.
1414

15+
local bit will_reset = 0;
1516
bit under_reset = 0;
1617
bit is_initialized; // Indicates that the initialize() method has been called.
1718

@@ -107,8 +108,22 @@ class dv_base_env_cfg #(type RAL_T = dv_base_reg_block) extends uvm_object;
107108
protected virtual function void post_build_ral_settings(dv_base_reg_block ral);
108109
endfunction
109110

111+
// This can be used to stop transaction generators either upon reset or in preparation to
112+
// issue a random reset.
113+
virtual function bit stop_transaction_generators();
114+
return this.will_reset || this.under_reset;
115+
endfunction
116+
117+
// This can be used to announce the intention to generate a random reset soon, to allow
118+
// transaction generators to stop, and fire a reset with no outstanding transactions.
119+
virtual function void set_intention_to_reset();
120+
`uvm_info(`gfn, "Setting intention to reset", UVM_MEDIUM)
121+
this.will_reset = 1'b1;
122+
endfunction
123+
110124
virtual function void reset_asserted();
111125
this.under_reset = 1;
126+
this.will_reset = 0;
112127
csr_utils_pkg::reset_asserted();
113128
endfunction
114129

vendor/lowrisc_ip/dv/sv/mem_bkdr_util/mem_bkdr_util__otp.sv

+25-17
Original file line numberDiff line numberDiff line change
@@ -123,30 +123,38 @@ virtual function void otp_write_secret2_partition(bit [RmaTokenSize*8-1:0] rma_u
123123
write64(Secret2DigestOffset, digest);
124124
endfunction
125125

126-
virtual function void otp_write_hw_cfg_partition(
127-
bit [DeviceIdSize*8-1:0] device_id, bit [ManufStateSize*8-1:0] manuf_state,
128-
bit [EnSramIfetchSize*8-1:0] en_sram_ifetch,
129-
bit [EnCsrngSwAppReadSize*8-1:0] en_csrng_sw_app_read,
130-
bit [EnEntropySrcFwReadSize*8-1:0] en_entropy_src_fw_read,
131-
bit [EnEntropySrcFwOverSize*8-1:0] en_entropy_src_fw_over);
132-
bit [HwCfgDigestSize*8-1:0] digest;
126+
virtual function void otp_write_hw_cfg0_partition(
127+
bit [DeviceIdSize*8-1:0] device_id, bit [ManufStateSize*8-1:0] manuf_state);
128+
bit [HwCfg0DigestSize*8-1:0] digest;
133129

134-
bit [bus_params_pkg::BUS_DW-1:0] hw_cfg_data[$];
130+
bit [bus_params_pkg::BUS_DW-1:0] hw_cfg0_data[$];
135131

136132
for (int i = 0; i < DeviceIdSize; i += 4) begin
137133
write32(i + DeviceIdOffset, device_id[i*8+:32]);
138134
end
139135
for (int i = 0; i < ManufStateSize; i += 4) begin
140136
write32(i + ManufStateOffset, manuf_state[i*8+:32]);
141137
end
142-
write32(EnSramIfetchOffset,
143-
{en_entropy_src_fw_over, en_entropy_src_fw_read, en_csrng_sw_app_read, en_sram_ifetch});
144138

145-
hw_cfg_data = {<<32 {32'h0, en_entropy_src_fw_over, en_entropy_src_fw_read,
146-
en_csrng_sw_app_read, en_sram_ifetch, manuf_state, device_id}};
147-
digest = cal_digest(HwCfgIdx, hw_cfg_data);
139+
hw_cfg0_data = {<<32 {32'h0, manuf_state, device_id}};
140+
digest = cal_digest(HwCfg0Idx, hw_cfg0_data);
141+
142+
write64(HwCfg0DigestOffset, digest);
143+
endfunction
144+
145+
virtual function void otp_write_hw_cfg1_partition(
146+
bit [EnCsrngSwAppReadSize*8-1:0] en_csrng_sw_app_read,
147+
bit [EnSramIfetchSize*8-1:0] en_sram_ifetch);
148+
bit [HwCfg1DigestSize*8-1:0] digest;
149+
150+
bit [bus_params_pkg::BUS_DW-1:0] hw_cfg1_data[$];
151+
152+
write32(EnSramIfetchOffset, {en_csrng_sw_app_read, en_sram_ifetch});
153+
154+
hw_cfg1_data = {<<32 {32'h0, en_csrng_sw_app_read, en_sram_ifetch}};
155+
digest = cal_digest(HwCfg1Idx, hw_cfg1_data);
148156

149-
write64(HwCfgDigestOffset, digest);
157+
write64(HwCfg1DigestOffset, digest);
150158
endfunction
151159

152160
// Functions that clear the provisioning state of the buffered partitions.
@@ -169,8 +177,8 @@ virtual function void otp_clear_secret2_partition();
169177
end
170178
endfunction
171179

172-
virtual function void otp_clear_hw_cfg_partition();
173-
for (int i = 0; i < HwCfgSize; i += 4) begin
174-
write32(i + HwCfgOffset, 32'h0);
180+
virtual function void otp_clear_hw_cfg0_partition();
181+
for (int i = 0; i < HwCfg0Size; i += 4) begin
182+
write32(i + HwCfg0Offset, 32'h0);
175183
end
176184
endfunction

vendor/lowrisc_ip/dv/sv/mem_model/mem_model.sv

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class mem_model #(int AddrWidth = bus_params_pkg::BUS_AW,
4444

4545
function void compare_byte(mem_addr_t addr, logic [7:0] act_data);
4646
`uvm_info(`gfn, $sformatf("Compare Mem : Addr[0x%0h], Act Data[0x%0h], Exp Data[0x%0h]",
47-
addr, act_data, system_memory[addr]), UVM_MEDIUM)
47+
addr, act_data, system_memory[addr]), UVM_HIGH)
4848
`DV_CHECK_CASE_EQ(act_data, system_memory[addr],
4949
$sformatf("addr 0x%0h read out mismatch", addr))
5050
endfunction

vendor/lowrisc_ip/dv/tools/dvsim/vcs.hjson

+7-3
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,14 @@
147147
"-full64",
148148
// No need of generating report when merging coverage.
149149
"-noreport",
150+
// Parallel merge is slower than serial merge for most
151+
// small blocks, and the corresponding flags are commented
152+
// out. If this becomes problematic and you have a powerful
153+
// machine available, uncomment the three flags below.
150154
// Merge results from tests in parallel.
151-
"-parallel",
152-
"-parallel_split 20",
153-
"-parallel_temproot {cov_merge_dir}",
155+
// "-parallel",
156+
// "-parallel_split 20",
157+
// "-parallel_temproot {cov_merge_dir}",
154158
"+urg+lic+wait",
155159
// Merge same assert instances found in different VDBs.
156160
"-merge_across_libs",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Copyright lowRISC contributors.
2+
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
# SPDX-License-Identifier: Apache-2.0
4+
#
5+
# waiver file for prim_ram_1r1w
6+
7+
waive -rules {STAR_PORT_CONN_USE} -location {prim_ram_1r1w.sv} -regexp {.*wild card port connection encountered on instance.*} \
8+
-comment "Generated prims may have wildcard connections."
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright lowRISC contributors.
2+
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
# SPDX-License-Identifier: Apache-2.0
4+
#
5+
# waiver file for prim_sha2 pre_dv Verilator testbenches
6+
7+
# waive long line violations in test vectors feeding
8+
waive --rule=line-length --location="prim_sha_multimode32_tb.sv"
9+
waive --rule=line-length --location="prim_sha_tb.sv"

0 commit comments

Comments
 (0)