118 lines
2.7 KiB
Python
118 lines
2.7 KiB
Python
from migen.fhdl.std import *
|
|
from migen.genlib.record import *
|
|
from migen.flow.actor import EndpointDescription, Sink, Source
|
|
|
|
from misoclib.com.litepcie.common import *
|
|
|
|
# constants
|
|
fmt_type_dict = {
|
|
"mem_rd32": 0b0000000,
|
|
"mem_wr32": 0b1000000,
|
|
"mem_rd64": 0b0100000,
|
|
"mem_wr64": 0b1100000,
|
|
|
|
"cpld": 0b1001010,
|
|
"cpl": 0b0001010
|
|
}
|
|
|
|
cpl_dict = {
|
|
"sc": 0b000,
|
|
"ur": 0b001,
|
|
"crs": 0b010,
|
|
"ca": 0b011
|
|
}
|
|
|
|
max_request_size = 512
|
|
|
|
|
|
# headers
|
|
class HField():
|
|
def __init__(self, word, offset, width):
|
|
self.word = word
|
|
self.offset = offset
|
|
self.width = width
|
|
|
|
tlp_header_w = 128
|
|
|
|
tlp_common_header = {
|
|
"fmt": HField(0, 29, 2),
|
|
"type": HField(0, 24, 5),
|
|
}
|
|
|
|
tlp_request_header = {
|
|
"fmt": HField(0, 29, 2),
|
|
"type": HField(0, 24, 5),
|
|
"tc": HField(0, 20, 3),
|
|
"td": HField(0, 15, 1),
|
|
"ep": HField(0, 14, 1),
|
|
"attr": HField(0, 12, 2),
|
|
"length": HField(0, 0, 10),
|
|
|
|
"requester_id": HField(1, 16, 16),
|
|
"tag": HField(1, 8, 8),
|
|
"last_be": HField(1, 4, 4),
|
|
"first_be": HField(1, 0, 4),
|
|
|
|
"address": HField(2, 2, 30),
|
|
}
|
|
|
|
tlp_completion_header = {
|
|
"fmt": HField(0, 29, 2),
|
|
"type": HField(0, 24, 5),
|
|
"tc": HField(0, 20, 3),
|
|
"td": HField(0, 15, 1),
|
|
"ep": HField(0, 14, 1),
|
|
"attr": HField(0, 12, 2),
|
|
"length": HField(0, 0, 10),
|
|
|
|
"completer_id": HField(1, 16, 16),
|
|
"status": HField(1, 13, 3),
|
|
"bcm": HField(1, 12, 1),
|
|
"byte_count": HField(1, 0, 12),
|
|
|
|
"requester_id": HField(2, 16, 16),
|
|
"tag": HField(2, 8, 8),
|
|
"lower_address": HField(2, 0, 7),
|
|
}
|
|
|
|
|
|
# layouts
|
|
def _layout_from_header(header):
|
|
_layout = []
|
|
for k, v in sorted(header.items()):
|
|
_layout.append((k, v.width))
|
|
return _layout
|
|
|
|
|
|
def tlp_raw_layout(dw):
|
|
layout = [
|
|
("header", tlp_header_w),
|
|
("dat", dw),
|
|
("be", dw//8)
|
|
]
|
|
return EndpointDescription(layout, packetized=True)
|
|
|
|
|
|
def tlp_common_layout(dw):
|
|
layout = _layout_from_header(tlp_common_header) + [
|
|
("dat", dw),
|
|
("be", dw//8)
|
|
]
|
|
return EndpointDescription(layout, packetized=True)
|
|
|
|
|
|
def tlp_request_layout(dw):
|
|
layout = _layout_from_header(tlp_request_header) + [
|
|
("dat", dw),
|
|
("be", dw//8)
|
|
]
|
|
return EndpointDescription(layout, packetized=True)
|
|
|
|
|
|
def tlp_completion_layout(dw):
|
|
layout = _layout_from_header(tlp_completion_header) + [
|
|
("dat", dw),
|
|
("be", dw//8)
|
|
]
|
|
return EndpointDescription(layout, packetized=True)
|