Verilog逻辑翻译

时间:2015-03-08 15:41:00

标签: performance optimization verilog compiler-optimization area

以下内容如何转换为硬件?如果我有多个相同的等式将其分配给不同的寄存器,它是如何翻译的?说我有

reg [31:0] A;
reg [31:0] B;
reg [31:0] C;
reg [31:0] D;

function [31:0] foo;
     reg [31:0] x, y ,z;
     // do something
endfunction

always@(posedge clk)
.
.
.
A <= (B <<< 50) + (C ^ D | A) + A;
B <= C + A + B;
C <= foo((B <<< 50) + (C ^ D | A) + A, C + A + B, C <<< 30)
.
.
.

我是否有两个组合块(总共4个块)

(B <<< 50) + (C ^ D | A) + A
and
C + A + B

或者我只将每个(2个块)中的一个连接到A,B,C和foo中?如果编译器分别生成其中两个逻辑,是否有办法确保每个逻辑中只有一个,并且这两个组合逻辑连接到多个寄存器?

1 个答案:

答案 0 :(得分:1)

如@mcleod_ideafix所述,它通常依赖于编译器/综合工具。在看到重复的逻辑时,有些人比其他人更好:

(B <<< 50) + (C ^ D | A) + A;

C + A + B;

您应该做的是编写代码以明确地将这些操作作为自己的总线调用,然后在表达式中重用该命名总线。这将清楚地显示综合工具,即非阻塞语句包含设计中已存在的逻辑。这样也可以更容易地在模拟中进行调试,因为您现在可以轻松地将temp1和temp2拖放到波形查看器上。它肯定是更长,因为它增加了两行代码。但它使您的代码更清晰,更易于理解,并且更有可能提供您想要的较小区域结果。以下是一个例子:

reg [31:0] A;
reg [31:0] B;
reg [31:0] C;
reg [31:0] D;

function [31:0] foo;
     reg [31:0] x, y ,z;
     // do something
endfunction

wire [31:0] temp1 = (B <<< 50) + (C ^ D | A) + A;
wire [31:0] temp2 = C + A + B;

always@(posedge clk)
.
.
.
A <= temp1;
B <= temp2;
C <= foo(temp1, temp2, C <<< 30)
.
.
.