流水线化一个verilog模块,包含10个串联的组件

时间:2018-03-21 22:50:48

标签: verilog pipeline digital-design

我正在尝试管道一个模块,该模块由5个乘法器和5个串联的加法器组成。该模块是一个多项式计算器。如果没有流水线,模块到目前为止工作正常。

+----+---------+
| id | name    |
+----+---------+
|  1 | seats   |
|  3 | tires   |
+----+---------+

没有流水线,结构如下所示,

multipliers [31:0] m0,m1,m2,m3,m4; // separate module
adders      [31:0] a0,a1,a2,a3,a4; // separate module
user_input  [31:0] input;          // register
constants   [31:0] c0,c1,c2,c3,c4; // registers
pipeliners  [31:0] p0,p1,p3,p4,p4; // pipelining resisters
wires       [31:0] w0,w1,w2,w3,w4; // wires

由于所有这些都是串联连接,关键路径由10个组件组成。

我实现了流水线操作的想法,

[input]*[c0] => w0 => [w0]+[c1] => w1 => [w1]*[input] => w2 => [w2]+[c2] => w3 ... //goes on like this

我有一个错误,“不能由原语或连续赋值驱动。”这是由于p0,p1,p3 ...寄存器。将它们转换为导线可以解决错误,但之后它们不再是寄存器。我使用iverilog作为编译器。

我的问题是,如何进行流水线操作以便使用最少的时钟周期获得输出并解决错误?

*******使用代码*******编辑的版本

[input]*[c0] => w0 => p0 => [p0]+[c1] => w1 => p1 => [p1]*[input] => w2=> p2 => [p2]+[c2] => w3 ... //goes on like this

1 个答案:

答案 0 :(得分:0)

正如摩根已经声明的那样,如果你有一个时钟和一个时钟,你只能获得寄存器。

always @(posedge clk)
begin
   p1 <= y4;
   p2 <= q;
   // etc.
 end

如果您认为这是相当明显的,因为这是一个寄存器:

enter image description here

你可以看到其中有一个信号和一个时钟作为输入。