1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
; RUN: firrtl -i %s -o %s.v -X verilog -p c 2>&1 | tee %s.out | FileCheck %s
;CHECK: Infer Widths
; CHECK: Finished Infer Widths
circuit MemSerdes :
module MemSerdes :
input clock : Clock
input reset : UInt<1>
input wide : {req_cmd : {flip ready : UInt<1>, valid : UInt<1>, bits : {addr : UInt<26>, tag : UInt<7>, rw : UInt<1>}}, req_data : {flip ready : UInt<1>, valid : UInt<1>, bits : {data : UInt<128>}}, flip resp : {flip ready : UInt<1>, valid : UInt<1>, bits : {data : UInt<128>, tag : UInt<7>}}}
output narrow : {req : {flip ready : UInt<1>, valid : UInt<1>, bits : UInt<16>}, flip resp : {valid : UInt<1>, bits : UInt<16>}}
wide.resp.bits.tag <= UInt<1>("h00")
wide.resp.bits.data <= UInt<1>("h00")
wide.resp.valid <= UInt<1>("h00")
wide.req_data.ready <= UInt<1>("h00")
wide.req_cmd.ready <= UInt<1>("h00")
narrow.req.bits <= UInt<1>("h00")
narrow.req.valid <= UInt<1>("h00")
node T_218961 = cat(wide.req_cmd.bits.tag, wide.req_cmd.bits.rw)
node T_218962 = cat(wide.req_cmd.bits.addr, T_218961)
reg out_buf : UInt, clock, reset, out_buf
reg in_buf : UInt, clock, reset, in_buf
reg state : UInt<3>, clock, reset,UInt<3>("h00")
reg send_cnt : UInt<3>, clock, reset, UInt<3>("h00")
reg data_send_cnt : UInt<2>, clock, reset, UInt<2>("h00")
node T_218984 = eq(send_cnt, UInt<2>("h02"))
node adone = and(narrow.req.ready, T_218984)
node T_218987 = eq(send_cnt, UInt<3>("h07"))
node ddone = and(narrow.req.ready, T_218987)
node T_218989 = and(narrow.req.valid, narrow.req.ready)
when T_218989 :
node T_218991 = addw(send_cnt, UInt<1>("h01"))
send_cnt <= T_218991
node T_218992 = shr(out_buf, 16)
out_buf <= T_218992
node T_218993 = and(wide.req_cmd.valid, wide.req_cmd.ready)
when T_218993 :
node T_218994 = cat(wide.req_cmd.bits.tag, wide.req_cmd.bits.rw)
node T_218995 = cat(wide.req_cmd.bits.addr, T_218994)
out_buf <= T_218995
node T_218996 = and(wide.req_data.valid, wide.req_data.ready)
when T_218996 : out_buf <= wide.req_data.bits.data
node T_218997 = eq(state, UInt<3>("h00"))
wide.req_cmd.ready <= T_218997
node T_218998 = eq(state, UInt<3>("h03"))
wide.req_data.ready <= T_218998
node T_218999 = eq(state, UInt<3>("h01"))
node T_219000 = eq(state, UInt<3>("h02"))
node T_219001 = or(T_218999, T_219000)
node T_219002 = eq(state, UInt<3>("h04"))
node T_219003 = or(T_219001, T_219002)
narrow.req.valid <= T_219003
narrow.req.bits <= out_buf
node T_219004 = eq(state, UInt<3>("h00"))
node T_219005 = and(T_219004, wide.req_cmd.valid)
when T_219005 :
node T_219006 = mux(wide.req_cmd.bits.rw, UInt<3>("h02"), UInt<3>("h01"))
state <= T_219006
node T_219007 = eq(state, UInt<3>("h01"))
node T_219008 = and(T_219007, adone)
when T_219008 :
state <= UInt<3>("h00")
send_cnt <= UInt<1>("h00")
node T_219010 = eq(state, UInt<3>("h02"))
node T_219011 = and(T_219010, adone)
when T_219011 :
state <= UInt<3>("h03")
send_cnt <= UInt<1>("h00")
node T_219013 = eq(state, UInt<3>("h03"))
node T_219014 = and(T_219013, wide.req_data.valid)
when T_219014 : state <= UInt<3>("h04")
node T_219015 = eq(state, UInt<3>("h04"))
node T_219016 = and(T_219015, ddone)
when T_219016 :
node T_219018 = addw(data_send_cnt, UInt<1>("h01"))
data_send_cnt <= T_219018
node T_219020 = eq(data_send_cnt, UInt<2>("h03"))
node T_219021 = mux(T_219020, UInt<3>("h00"), UInt<3>("h03"))
state <= T_219021
send_cnt <= UInt<1>("h00")
reg recv_cnt : UInt<4>, clock, reset, UInt<4>("h00")
reg data_recv_cnt : UInt<2>, clock, reset, UInt<2>("h00")
reg resp_val : UInt<1>, clock, reset, UInt<1>("h00")
resp_val <= UInt<1>("h00")
when narrow.resp.valid :
node T_219031 = addw(recv_cnt, UInt<1>("h01"))
recv_cnt <= T_219031
node T_219033 = eq(recv_cnt, UInt<4>("h08"))
when T_219033 :
recv_cnt <= UInt<1>("h00")
node T_219036 = addw(data_recv_cnt, UInt<1>("h01"))
data_recv_cnt <= T_219036
resp_val <= UInt<1>("h01")
node T_219038 = bits(in_buf, 143, 16)
node T_219039 = cat(narrow.resp.bits, T_219038)
in_buf <= T_219039
wide.resp.valid <= resp_val
wire T_219043 : {data : UInt<128>, tag : UInt<7>}
T_219043.tag <= UInt<1>("h00")
T_219043.data <= UInt<1>("h00")
node T_219048 = bits(in_buf, 6, 0)
T_219043.tag <= T_219048
node T_219049 = bits(in_buf, 134, 7)
T_219043.data <= T_219049
wide.resp.bits <- T_219043
|