2025-11-07

vak: (Daemon)
Стефано Маринелли делится 20-летним опытом внедрения и сопровождения юниксных систем и сервисов.

vak: (Default)
Полезная особенность языка Go - на нём отлично моделируется асинхронная логика. Суть там в 4-фазном протоколе. Подробности в моём старом посте.



На Go всякий такой сигнал от одного гейта к другому делается в виде пары каналов:
type Handshake[Treq any, Tack any] struct {
Req chan Treq
Ack chan Tack
}
По каналу запроса передаются значения в одну сторону, по каналу ответа - в обратную. Если нужен только сигнал, без всякого значения - передаём struct{} (аналог void). Вот пример реализации сложения двух чисел:
func AsyncAdder(a, b, sum *Handshake[int, struct{}]) {
for {
// Wait for inputs to arrive
var x, y int
haveA, haveB := false, false

for !(haveA && haveB) {
select {
case x = <-a.Req:
haveA = true
case y = <-b.Req:
haveB = true
}
}

// Compute sum
s := x + y

// Send result downstream (Req↑)
sum.Req <- s

// Wait for output Ack↑
<-sum.Ack

// Only now acknowledge inputs (completing 4-phase handshake)
a.Ack <- struct{}{}
b.Ack <- struct{}{}
}
}
Полный текст здесь: add.go



Интересно было бы сдизайнить цельный асинхронный процессор в таком виде, скажем riscv32. А потом засунуть в FPGA.