Plusargs -- tilelink timeout detection from the command line (#752)
* util: PlusArg gives Chisel access to the command-line * tilelink2: add a progress watchdog to Monitors
This commit is contained in:
parent
20704b1454
commit
7f1d3c445f
@ -155,6 +155,7 @@ done_processing:
|
|||||||
srand48(random_seed);
|
srand48(random_seed);
|
||||||
|
|
||||||
Verilated::randReset(2);
|
Verilated::randReset(2);
|
||||||
|
Verilated::commandArgs(argc, argv);
|
||||||
TEST_HARNESS *tile = new TEST_HARNESS;
|
TEST_HARNESS *tile = new TEST_HARNESS;
|
||||||
|
|
||||||
#if VM_TRACE
|
#if VM_TRACE
|
||||||
|
@ -435,6 +435,13 @@ class TLMonitor(args: TLMonitorArgs) extends TLMonitorBase(args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
inflight := (inflight | a_set) & ~d_clr
|
inflight := (inflight | a_set) & ~d_clr
|
||||||
|
|
||||||
|
val watchdog = RegInit(UInt(0, width = 32))
|
||||||
|
val limit = util.PlusArg("tilelink_timeout")
|
||||||
|
assert (!inflight.orR || limit === UInt(0) || watchdog < limit, "TileLink timeout expired" + extra)
|
||||||
|
|
||||||
|
watchdog := watchdog + UInt(1)
|
||||||
|
when (bundle.a.fire() || bundle.d.fire()) { watchdog := UInt(0) }
|
||||||
}
|
}
|
||||||
|
|
||||||
def legalizeDESink(bundle: TLBundleSnoop, edge: TLEdge)(implicit sourceInfo: SourceInfo) {
|
def legalizeDESink(bundle: TLBundleSnoop, edge: TLEdge)(implicit sourceInfo: SourceInfo) {
|
||||||
|
21
src/main/scala/util/PlusArg.scala
Normal file
21
src/main/scala/util/PlusArg.scala
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// See LICENSE.SiFive for license details.
|
||||||
|
|
||||||
|
package util
|
||||||
|
import Chisel._
|
||||||
|
|
||||||
|
class plusarg_reader(format: String, default: Int) extends BlackBox(Map(
|
||||||
|
"FORMAT" -> chisel3.core.StringParam(format),
|
||||||
|
"DEFAULT" -> chisel3.core.IntParam(default))) {
|
||||||
|
val io = new Bundle {
|
||||||
|
val out = UInt(OUTPUT, width = 32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object PlusArg
|
||||||
|
{
|
||||||
|
// PlusArg("foo") will return 42 if the simulation is run with +foo=42
|
||||||
|
// Do not use this as an initial register value. The value is set in an
|
||||||
|
// initial block and thus accessing it from another initial is racey.
|
||||||
|
def apply(name: String, default: Int = 0): UInt =
|
||||||
|
Module(new plusarg_reader(name + "=%d", default)).io.out
|
||||||
|
}
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
bb_vsrcs = \
|
bb_vsrcs = \
|
||||||
$(base_dir)/vsrc/jtag_vpi.v \
|
$(base_dir)/vsrc/jtag_vpi.v \
|
||||||
|
$(base_dir)/vsrc/plusarg_reader.v \
|
||||||
$(base_dir)/vsrc/ClockDivider2.v \
|
$(base_dir)/vsrc/ClockDivider2.v \
|
||||||
$(base_dir)/vsrc/ClockDivider3.v \
|
$(base_dir)/vsrc/ClockDivider3.v \
|
||||||
$(base_dir)/vsrc/AsyncResetReg.v \
|
$(base_dir)/vsrc/AsyncResetReg.v \
|
||||||
|
22
vsrc/plusarg_reader.v
Normal file
22
vsrc/plusarg_reader.v
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// See LICENSE.SiFive for license details.
|
||||||
|
|
||||||
|
// No default parameter values are intended, nor does IEEE 1800-2012 require them (clause A.2.4 param_assignment),
|
||||||
|
// but Incisive demands them. These default values should never be used.
|
||||||
|
module plusarg_reader #(string FORMAT="borked", int DEFAULT=0) (
|
||||||
|
output [31:0] out
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [31:0] myplus;
|
||||||
|
assign out = myplus;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
myplus = DEFAULT;
|
||||||
|
`ifndef SYNTHESIS
|
||||||
|
`ifndef verilator
|
||||||
|
// Work-around for https://www.veripool.org/issues/1165
|
||||||
|
if (!$value$plusargs(FORMAT, myplus)) myplus = DEFAULT;
|
||||||
|
`endif
|
||||||
|
`endif
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
Loading…
Reference in New Issue
Block a user