blob: de3895e9f0b3e8613f1015de41ac24d47db42476 [file] [log] [blame] [edit]
import sys
import random
import re
def top_harness(DIN_N, DOUT_N, f=sys.stdout):
f.write(
'''
module top(input clk, stb, di, output do);
localparam integer DIN_N = %d;
localparam integer DOUT_N = %d;
reg [DIN_N-1:0] din;
wire [DOUT_N-1:0] dout;
reg [DIN_N-1:0] din_shr;
reg [DOUT_N-1:0] dout_shr;
always @(posedge clk) begin
din_shr <= {din_shr, di};
dout_shr <= {dout_shr, din_shr[DIN_N-1]};
if (stb) begin
din <= din_shr;
dout_shr <= dout;
end
end
assign do = dout_shr[DOUT_N-1];
roi roi (
.clk(clk),
.din(din),
.dout(dout)
);
endmodule
''' % (DIN_N, DOUT_N))
def instance(mod, name, ports, params={}, sort=True, string_buffer=sys.stdout):
# TODO: make this print nicer
tosort = sorted if sort else lambda x: x
print(' %s' % mod, file=string_buffer)
if len(params):
print(' #(', file=string_buffer)
for i, (paramk, paramv) in enumerate(tosort(params.items())):
comma = '' if i == len(params) - 1 else ','
print(
' .%s(%s)%s' % (paramk, paramv, comma),
file=string_buffer)
print(' )', file=string_buffer)
print(' %s (' % name, file=string_buffer)
for i, (portk, portv) in enumerate(tosort(ports.items())):
comma = '' if i == len(ports) - 1 else ','
print(
' .%s(%s)%s' % (portk, portv, comma),
file=string_buffer)
print(' );', file=string_buffer)
def quote(s):
return '"' + s + '"'
def unquote(s):
assert s[0] == '"' and s[-1] == '"'
return s[1:-1]
def to_int(s):
value = 0
match = re.search(r'^(\d+)\'([sS]*)([bBoOdDhH])(.*)', str(s))
if match:
width = int(match.group(1))
signed = match.group(2)
radix = match.group(3)
value = match.group(4)
# Convert to int type
if re.match(r'[bB]', radix):
value = int(value, 2)
elif re.match(r'[oO]', radix):
value = int(value, 8)
elif re.match(r'[dD]', radix):
value = int(value, 10)
elif re.match(r'[hH]', radix):
value = int(value, 16)
else:
raise ValueError('Don\'t know how to interpret input %s' % (s))
# Truncate to `width` bits
value &= 2**width - 1
else:
value = int(s)
return value
def parsei(s):
if s == "1'b0":
return 0
elif s == "1'b1":
return 1
else:
assert 0, 'FIXME'
def parse_bitstr(s):
n, postfix = s.split("'")
n = int(n)
assert postfix[0] == 'b'
bitstr = postfix[1:]
assert len(bitstr) == n
return [int(x) for x in bitstr]
def vrandbit():
if random.randint(0, 1):
return "1'b1"
else:
return "1'b0"
def vrandbits(n):
ret = "%u'b" % n
for _i in range(n):
ret += str(random.randint(0, 1))
return ret