15 / 20 · Thực hành
Thực hành: áp lực ngược và đặt lại
Thực hiện tạm dừng toàn cục, giữ kết quả và đặt lại công việc gián đoạn.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Tạm dừng thời gian logic như một thể thống nhất
Mảng học tập dùng advance toàn cục. Bộ lập lịch biên và mọi PE chỉ di chuyển khi gói bước logic tiếp theo sẵn có. Làn được lập lịch không hợp lệ không cần toán hạng thực. Chỉ cho một luồng tiến làm sai độ lệch. Liên kết dừng độc lập cần bộ đệm và quy tắc ghép bổ sung, ngoài thiết kế cơ sở này.
Đầu ra dùng quy ước valid/ready riêng. Khi kết quả sẵn sàng, giữ valid, data và job ổn định đến cạnh có valid&&ready truyền đúng một lần. Lớp bao đơn giản không bắt đầu công việc mới khi kết quả cũ còn chờ. Sự sẵn sàng của bên nhận không cần dừng tính toán nếu đủ lưu trữ kết quả.
Lưu thành stall-lab.mjs và chạy node stall-lab.mjs. Nó mô hình hóa PE hai số hạng cộng thanh ghi kết quả, không cần gói và in Stall/reset lab passed.
import assert from 'node:assert/strict';
let s;
function reset(){s={step:0,acc:0,valid:false,data:0,job:7};}
const pairs=[[-2,3],[4,-5]];
function tick({advance=true,ready=false,rst=false}={}){
if(rst){reset();return null;}
if(s.valid){if(!ready)return null;
const out={data:s.data,job:s.job};s.valid=false;return out;}
if(advance&&s.step<pairs.length){
const [a,b]=pairs[s.step];s.acc+=a*b;s.step++;
if(s.step===pairs.length){s.data=s.acc;s.valid=true;}}
return null;
}
reset();tick();assert.equal(s.acc,-6);
const held={...s};tick({advance:false});assert.deepEqual(s,held);
tick();assert.equal(s.data,-26);assert.equal(s.valid,true);
const blocked={...s};tick({ready:false});tick({ready:false});
assert.deepEqual(s,blocked);
assert.deepEqual(tick({ready:true}),{data:-26,job:7});
assert.equal(tick({ready:true}),null);
reset();tick();tick({rst:true,advance:false});
assert.deepEqual(s,{step:0,acc:0,valid:false,data:0,job:7});
tick();tick();assert.equal(s.data,-26);
console.log('Stall/reset lab passed');Diễn giải các phép kiểm tra
Tạm dừng giữ tổng đầu −6 và vị trí lịch. Số hạng thứ hai tạo −26. Hai cạnh đầu ra bị chặn giữ kết quả; cạnh ready truyền một lần. Đặt lại giữa công việc chưa hoàn thành xóa bộ tích lũy, vị trí và trạng thái valid kết quả, nên khôi phục bắt đầu lại công việc.
Thêm hai tạm dừng toàn cục vào lịch 2×2 bốn bước cho bốn cạnh advance và sáu cạnh vật lý. Kết quả và danh sách k đã nhận phải khớp lần chạy không dừng. Công thức hoàn thành logic không đổi.
Đây là tham chiếu điều khiển đồng bộ. Đồng bộ hóa reset vật lý và chuyển miền xung nhịp cần thiết kế riêng. Công việc bị reset hủy không bao giờ được báo hoàn thành thành công; xóa bộ đệm phía trước trước khi khởi động lại. Mô hình thành công không xác lập chấp nhận RTL, ứng dụng đã cài hay phần cứng.
Tự thử
Giữ valid=1 và ready=0 trong ba cạnh, rồi kích hoạt ready. Tín hiệu nào phải giữ, có bao nhiêu lần truyền, và nếu reset đến khi chờ thì sao?
Đọc giải thích
Giữ data, job và valid. Khi chờ không truyền kết quả nào; cạnh ready truyền một. Reset loại trạng thái valid đang chờ và không được chuyển giao công việc đó như thành công. Mọi thông báo hủy cần quy ước trạng thái riêng.