代码参考重庆大学计算机组成实验,并且在此基础上添加了刷新和暂停,主要目的是理解一下阻塞流水线。
代码
`timescale 1ns / 1ps
// 带有暂停与刷新功能的八位四级流水线,
module adder8Bits4StepsWithStopAndClear
(
input [7 : 0] num1,
input [7 : 0] num2,
// 上一位的进位
input cin,
// 输入是否有效
input validIn,
// 刷新
input rst,
// 暂停
input stop,
input clk,
input outAllow,
// 判断输出是否有效
output wire validOut,
output wire count,
output wire [7 : 0] sum
);
reg count1, count2, count3;
// 记录每一层是否有效
reg pipe1Valid;
reg pipe2Valid;
reg pipe3Valid;
reg pipe4Valid;
// 第一级流水
reg [1:0] sum1;
// 控制变量:和之前的一样
// 表示pipe1能否被上一级刷新
wire pipe1AllowIn;
// 表示pipe1是否可以用于刷新下一级
wire pipe1ReadyGo;
// 表示pipe1能否进入pipe2
wire pipe1ToPipe2Valid;
//第二级流水
reg [3:0] sum2;
wire pipe2AllowIn;
wire pipe2ReadyGo;
wire pipe2ToPipe3Valid;
//第三级流水
reg [5:0] sum3;
wire pipe3AllowIn;
wire pipe3ReadyGo;
wire pipe3ToPipe4Valid;
//第四级流水
wire pipe4AllowIn;
wire pipe4ReadyGo;
reg [7 : 0]sum4;
reg count4;
// 如果没有暂停,那么就可以Go
assign pipe1ReadyGo = !stop;
// 如果pipe1中的值已经无效,或者这一轮一定会传给下一个,那么就可以进行接收
assign pipe1AllowIn = ! pipe1Valid || pipe1ReadyGo && pipe2AllowIn;
// 如果pipe1有效,并且pipe1可以进行传输,那么pipe1ToPipe2Valid可以进行。
assign pipe1ToPipe2Valid = pipe1Valid && pipe1ReadyGo;
// 是否有效
always @ (posedge clk) begin
// 如果需要刷新,那么pipe1Valid 变为0,表示pipe1中的值不再有效
if( rst ) begin
pipe1Valid |