Altifigence Academy

22 / 24 · Thực hành

Thực hành tổng kết: FIFO và bộ tính luồng hai tầng

Nối FIFO đầu vào độ sâu hai, hai tầng co giãn và bảng theo dõi.

Kết hợp lưu trữ, tính toán và chuyển giao

Dự án tổng kết có FIFO đầu vào hai phần tử và hai tầng tính toán co giãn. Tầng thứ nhất lưu tổng chín bit a+b; tầng thứ hai lưu 3×sum modulo 256. Thẻ đi theo mọi giá trị. Tổng dung lượng là bốn giao dịch. Áp lực ngược lan từ đầu ra trong khi ô trống vẫn có thể được nạp. Giả định một xung nhịp, FIFO có thanh ghi, pop/push đồng thời và đầu ra không đi xuyên.

Lưu thủ công capstone-model.mjs và chạy node capstone-model.mjs. Tính mọi ready và giá trị tầng tiếp theo từ trạng thái cũ trước khi cập nhật FIFO và thanh ghi. Mảng JavaScript là hàng đợi chức năng, không phải HDL tổng hợp được.

javascript
import assert from 'node:assert/strict';
const input = [[0,0],[1,2],[250,10],[255,255],
               [128,128],[17,240],[90,90],[4,8]];
const q = [], expected = [], seen = [];
let s1 = null, s2 = null, issued = 0, delivered = 0;
for (let edge = 0; edge < 50; edge++) {
  const ready = edge >= 25 || ![2,3,4].includes(edge % 7);
  const old1 = s1, old2 = s2;
  const r2 = old2 === null || ready;
  const r1 = old1 === null || r2;
  const pop = q.length > 0 && r1;
  const inReady = q.length < 2 || pop;
  if (old2 !== null && ready) {
    assert.deepEqual(old2, expected.shift());
    seen.push(old2.y);
    delivered++;
  }
  const n2 = r2 ? (old1 === null ? null :
    { tag: old1.tag, y: old1.sum * 3 % 256 }) : old2;
  const n1 = r1 ? (pop ?
    { tag: q[0].tag, sum: q[0].a + q[0].b } : null) : old1;
  if (pop) q.shift();
  if (issued < input.length && inReady) {
    const [a,b] = input[issued];
    q.push({ tag: issued, a, b });
    expected.push({ tag: issued, y: (3*a + 3*b) % 256 });
    issued++;
  }
  s1 = n1; s2 = n2;
  if (old2 !== null && !ready) assert.deepEqual(s2, old2);
  assert.ok(q.length <= 2);
  assert.equal(issued - delivered,
    q.length + Number(s1 !== null) + Number(s2 !== null));
}
assert.equal(issued, input.length);
assert.equal(delivered, input.length);
assert.deepEqual(seen, [0,9,12,250,0,3,28,36]);
assert.equal(expected.length + q.length, 0);
assert.equal(s1, null); assert.equal(s2, null);
console.log('CAPSTONE PASS: 8 ordered outputs, drained');
Thẻa,bKết quả rộngy
2250,1078012
3255,2551530250
517,2407713

Đầu vào đầu vào FIFO tại cạnh 0, s1 tại cạnh 1 và s2 tại cạnh 2. Đích dừng tại cạnh 2,3,4 làm chậm chuyển giao đến cạnh 5. Độ trễ không dừng là ba cạnh; giao dịch này mất năm. Chỗ lưu trữ trống khác được nạp trong khi s2 giữ.

Hàng đợi tham chiếu chỉ tính giá trị kỳ vọng khi chấp nhận. So thẻ và kết quả khi chuyển giao,kiểm tra số phần tử mỗi cạnh. Sau cạnh 25,tháo hết mọi thứ. Lần chạy Node kiểm tra tám kết quả có thứ tự;các tệp SystemVerilog dưới thử độc lập thanh ghi FIFO và pipeline thực.

Xây dựng và mô phỏng RTL

Tải dp_stream_calculator.sv và tb_dp_stream_calculator.sv vào cùng thư mục. Giao diện a,b,tag tám bit không dấu chấp nhận theo in-valid/in-ready và chuyển giao y cùng thẻ theo out-valid/out-ready. Tổng chín bit và giá trị đã nhân tỷ lệ mười một bit chỉ thu hẹp tại đầu ra. Reset làm trống lưu trữ và chặn truyền.

Chạy khi đã cài Icarus Verilog:

text
iverilog -g2012 -Wall -s tb_dp_stream_calculator -o dp-test.vvp dp_stream_calculator.sv tb_dp_stream_calculator.sv
vvp dp-test.vvp

Việc kiểm chứng của tác giả đã biên dịch và mô phỏng thành công các tệp này:

text
RTL PASS: accepted=527 delivered=523 canceled=4 stalls=517 full_replace=64 wraps=262 reset_with_work=1 zero=3

Testbench kiểm tra số học,thẻ,thứ tự,dừng,thay thế khi đầy,quay vòng con trỏ,hủy bốn phần tử bằng reset và tháo hết. Đổi độ dài dừng,so độ trễ với ba chu kỳ không dừng. Điều này kiểm chứng mô phỏng RTL Icarus,không phải tổng hợp,thời gian vật lý hay thực thi DDS.

Tự thử

Với đích luôn ready, tag0 truyền tại cạnh nào? Nếu độ sâu FIFO thành một, độ trễ không dừng và tổng dung lượng thay đổi thế nào?

Đọc giải thích

Tag0 truyền tại cạnh 3 sau chấp nhận tại 0, s1 tại 1 và s2 tại 2. Giữ FIFO có thanh ghi bảo toàn độ trễ ba cạnh; dung lượng giảm còn 1+1+1=3 giao dịch. Đổi giới hạn độ sâu input-ready và kiểm tra lại mô hình.

Lesson files

capstone-model.mjs ↓dp_stream_calculator.sv ↓tb_dp_stream_calculator.sv ↓

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.