2024-05-18 11:06:57 +00:00
|
|
|
#import "@preview/cetz:0.2.2": draw
|
|
|
|
#import "../src/lib.typ": *
|
|
|
|
|
2024-05-18 16:08:36 +00:00
|
|
|
#set page(width: auto, height: auto, margin: .5cm)
|
2024-05-18 11:06:57 +00:00
|
|
|
|
|
|
|
#circuit({
|
|
|
|
element.group(id: "toplvl", name: "Toplevel", {
|
|
|
|
element.group(
|
|
|
|
id: "proc",
|
|
|
|
name: "Processor",
|
|
|
|
padding: 1.5em,
|
|
|
|
stroke: (dash: "dashed"),
|
|
|
|
{
|
|
|
|
element.block(
|
|
|
|
x: 0, y: 0, w: 8, h: 4,
|
|
|
|
id: "dp",
|
|
|
|
fill: util.colors.pink,
|
|
|
|
name: "Datapath",
|
|
|
|
ports: (
|
|
|
|
north: (
|
2024-05-18 21:46:29 +00:00
|
|
|
(id: "clk", clock: true, small: true),
|
2024-05-18 11:06:57 +00:00
|
|
|
(id: "Zero"),
|
|
|
|
(id: "Regsrc"),
|
|
|
|
(id: "PCSrc"),
|
|
|
|
(id: "ResultSrc"),
|
|
|
|
(id: "ALUControl"),
|
|
|
|
(id: "ImmSrc"),
|
|
|
|
(id: "RegWrite"),
|
|
|
|
(id: "dummy")
|
|
|
|
),
|
|
|
|
east: (
|
|
|
|
(id: "PC", name: "PC"),
|
|
|
|
(id: "Instr", name: "Instr"),
|
|
|
|
(id: "ALUResult", name: "ALUResult"),
|
|
|
|
(id: "dummy"),
|
|
|
|
(id: "WriteData", name: "WriteData"),
|
|
|
|
(id: "ReadData", name: "ReadData"),
|
|
|
|
),
|
|
|
|
west: (
|
|
|
|
(id: "rst"),
|
|
|
|
)
|
|
|
|
),
|
|
|
|
ports-margins: (
|
|
|
|
north: (0%, 0%),
|
|
|
|
west: (0%, 70%)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
element.block(
|
|
|
|
x: 0, y: 7, w: 8, h: 3,
|
|
|
|
id: "ctrl",
|
|
|
|
fill: util.colors.orange,
|
|
|
|
name: "Controller",
|
|
|
|
ports: (
|
|
|
|
east: (
|
|
|
|
(id: "Instr", name: "Instr"),
|
|
|
|
),
|
|
|
|
south: (
|
|
|
|
(id: "dummy"),
|
|
|
|
(id: "Zero"),
|
|
|
|
(id: "Regsrc"),
|
|
|
|
(id: "PCSrc"),
|
|
|
|
(id: "ResultSrc"),
|
|
|
|
(id: "ALUControl"),
|
|
|
|
(id: "ImmSrc"),
|
|
|
|
(id: "RegWrite"),
|
|
|
|
(id: "MemWrite")
|
|
|
|
)
|
|
|
|
),
|
|
|
|
ports-margins: (
|
|
|
|
south: (0%, 0%)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
wire.wire(
|
|
|
|
"w-Zero",
|
|
|
|
("dp-port-Zero", "ctrl-port-Zero"),
|
|
|
|
name: "Zero",
|
|
|
|
name-pos: "start",
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
for p in ("Regsrc", "PCSrc", "ResultSrc", "ALUControl", "ImmSrc", "RegWrite") {
|
|
|
|
wire.wire(
|
|
|
|
"w-" + p,
|
|
|
|
("ctrl-port-"+p, "dp-port-"+p),
|
|
|
|
name: p,
|
|
|
|
name-pos: "start",
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
draw.content(
|
|
|
|
(rel: (0, 1em), to: "ctrl.north"),
|
|
|
|
[*RISCV single*],
|
|
|
|
anchor: "south"
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
element.block(
|
|
|
|
x: (rel: 3.5, to: "dp.east"),
|
|
|
|
y: (from: "dp-port-ReadData", to: "RD"),
|
|
|
|
w: 3, h: 4,
|
|
|
|
id: "dmem",
|
|
|
|
fill: util.colors.green,
|
|
|
|
name: "Data\n Memory",
|
|
|
|
ports: (
|
|
|
|
north: (
|
2024-05-18 21:46:29 +00:00
|
|
|
(id: "clk", clock: true, small: true),
|
2024-05-18 11:06:57 +00:00
|
|
|
(id: "WE", name: "WE")
|
|
|
|
),
|
|
|
|
west: (
|
|
|
|
(id: "dummy"),
|
|
|
|
(id: "dummy"),
|
|
|
|
(id: "A", name: "A"),
|
|
|
|
(id: "dummy"),
|
|
|
|
(id: "WD", name: "WD"),
|
|
|
|
(id: "RD", name: "RD"),
|
|
|
|
)
|
|
|
|
),
|
|
|
|
ports-margins: (
|
|
|
|
north: (0%, 10%)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
wire.wire(
|
|
|
|
"w-DataAddr",
|
|
|
|
("dp-port-ALUResult", "dmem-port-A"),
|
|
|
|
name: "DataAddr",
|
|
|
|
name-pos: "end",
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
wire.wire(
|
|
|
|
"w-WriteData",
|
|
|
|
("dp-port-WriteData", "dmem-port-WD"),
|
|
|
|
name: "WriteData",
|
|
|
|
name-pos: "end",
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
wire.wire(
|
|
|
|
"w-ReadData",
|
|
|
|
("dmem-port-RD", "dp-port-ReadData"),
|
|
|
|
name: "ReadData",
|
|
|
|
name-pos: "end",
|
|
|
|
reverse: true,
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
wire.wire(
|
|
|
|
"w-MemWrite",
|
|
|
|
("ctrl-port-MemWrite", "dmem-port-WE"),
|
|
|
|
style: "zigzag",
|
|
|
|
name: "MemWrite",
|
|
|
|
name-pos: "start",
|
|
|
|
zigzag-dir: "horizontal",
|
|
|
|
zigzag-ratio: 80%,
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
wire.stub(
|
|
|
|
"dmem-port-clk", "north",
|
|
|
|
name: "clk", length: 3pt
|
|
|
|
)
|
|
|
|
|
|
|
|
element.block(
|
|
|
|
x: (rel: 3.5, to: "dp.east"),
|
|
|
|
y: (from: "ctrl-port-Instr", to: "dummy"),
|
|
|
|
w: 3, h: 4,
|
|
|
|
id: "imem",
|
|
|
|
fill: util.colors.green,
|
|
|
|
name: "Instruction\n Memory",
|
|
|
|
ports: (
|
|
|
|
west: (
|
|
|
|
(id: "A", name: "A"),
|
|
|
|
(id: "dummy"),
|
|
|
|
(id: "dummy2"),
|
|
|
|
(id: "RD", name: "RD"),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
wire.wire(
|
|
|
|
"w-PC",
|
|
|
|
("dp-port-PC", "imem-port-A"),
|
|
|
|
style: "zigzag",
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
wire.wire(
|
|
|
|
"w-Instr1",
|
|
|
|
("imem-port-RD", "dp-port-Instr"),
|
|
|
|
style: "zigzag",
|
|
|
|
zigzag-ratio: 30%,
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
wire.wire(
|
|
|
|
"w-Instr2",
|
|
|
|
("imem-port-RD", "ctrl-port-Instr"),
|
|
|
|
style: "zigzag",
|
|
|
|
zigzag-ratio: 30%,
|
|
|
|
directed: true
|
|
|
|
)
|
|
|
|
wire.intersection("w-Instr1.zig", radius: 2pt)
|
|
|
|
draw.content("w-Instr1.zig", "Instr", anchor: "south", padding: 4pt)
|
|
|
|
draw.content("w-PC.zig", "PC", anchor: "south-east", padding: 2pt)
|
|
|
|
|
|
|
|
draw.content("dmem.south-west", [*External Memories*], anchor: "north", padding: 10pt)
|
|
|
|
})
|
|
|
|
|
2024-05-18 16:08:36 +00:00
|
|
|
draw.line(name: "w-dp-clk",
|
|
|
|
"dp-port-clk",
|
|
|
|
(rel: (0, .5), to: ()),
|
|
|
|
(
|
|
|
|
rel: (-.5, 0),
|
|
|
|
to: (horizontal: "toplvl.west", vertical: ())
|
|
|
|
)
|
2024-05-18 11:06:57 +00:00
|
|
|
)
|
|
|
|
draw.content("w-dp-clk.end", "clk", anchor: "east", padding: 3pt)
|
|
|
|
|
2024-05-18 16:08:36 +00:00
|
|
|
draw.line(name: "w-dp-rst",
|
|
|
|
"dp-port-rst",
|
|
|
|
(
|
|
|
|
rel: (-.5, 0),
|
|
|
|
to: (horizontal: "toplvl.west", vertical: ())
|
|
|
|
)
|
2024-05-18 11:06:57 +00:00
|
|
|
)
|
|
|
|
draw.content("w-dp-rst.end", "rst", anchor: "east", padding: 3pt)
|
|
|
|
})
|