Altifigence Academy

9 / 24 · 概念

在流水线边界存储完整事务

将求和与缩放运算分级,同时保持 valid、标签和位宽对齐。

寄存器边界同时承载数值含义和数据位

把 f(a,b)=3(a+b) 分成两级。第一级存储两个八位无符号操作数的九位和。第二级生成十一位缩放结果,并存储其低八位。最大的宽位结果为 1530。对这个整数表达式而言,缩窄中间和恰好不会改变最终模 256 的结果,但会丢失溢出报告或后续比较所需的信息。应明确保留中间结果的位宽。

每一级都把 valid 和标签与数据一起存储。valid 为零表示气泡。空级中可能仍保留旧数据位,但它们不得计为事务。标签需要与对应数值相同的寄存器延迟。若有两个数据寄存器,却只有一个标签寄存器,就会把事务 B 的身份附到事务 A 的结果上。

这个核心假定没有停顿,且端口始终 ready。乘法前应扩展 s1,并为常量指定位宽。第二级读取旧 s1 和 t1;新输入不能在一个时钟沿内穿过两个寄存器。

SystemVerilog
logic [8:0] s1;
logic [7:0] s2, t1, t2;
logic v1, v2;
logic [10:0] scaled;
assign scaled = {2'b00, s1} * 11'd3;
always_ff @(posedge clk) begin
  if (rst) begin
    v1 <= 1'b0;
    v2 <= 1'b0;
  end else begin
    v1 <= in_valid;
    v2 <= v1;
    if (in_valid) begin
      s1 <= {1'b0, a} + {1'b0, b};
      t1 <= in_tag;
    end
    if (v1) begin
      s2 <= scaled[7:0];
      t2 <= t1;
    end
  end
end

在时钟沿 0 接收 A=(1,2):之后 s1=3。在时钟沿 1 接收 B=(250,10):s1 变为 260,同时 s2 存储 A 的结果 9。A 在时钟沿 1 后有效,可以在时钟沿 2 传送。B 随后得到 780 对 256 取模的结果,即 12。

气泡也必须通过 valid 寄存器传递。如果缺少输入时仍保持旧 v1=1,就可能重复事务。复位清除有效状态,防止陈旧数据变成新结果。在每个边界列出所有伴随字段:操作码、标签、异常、地址或包结束标志。检查这些字段在整个流水线中始终构成同一个事务。

自己试试

连续接收 A=(1,2,tag=10) 和 B=(250,10,tag=11)。如果使用 t2<=in_tag,A 的结果会携带哪个标签?请给出正确连接。

阅读解释

在时钟沿 1,s2 计算的是旧事务 A,而当前 in_tag 为 11,因此结果 9 会携带标签 11。应使用 t2<=t1,采集 A 在第一级中的旧标签 10。

你的选择适用于此浏览器,可随时在页脚更改。