|

楼主 |
发表于 2012-8-14 06:08:12
|
显示全部楼层
本帖最后由 ttxs2009 于 2012-8-14 06:41 编辑
这两天听了各位大侠的指导,开始越来越感受到自己硬件思维的模糊。。。但是认识到错误,也是一种进步,所以特别感谢大家。
开始回想自己这几个月的仿真(虽然仿真结果对),似乎都是不可以综合的(这个太郁闷了。。)
刚看到一个帖子,他给出这样的总结:
(1)对组合逻辑建模采用阻塞式赋值。
(2)对时序逻辑建模采用非阻塞是赋值。
我这个题需要进行大量数值计算,估计要用(2)。所以我的“matlab风格的verilog描述”应该无法综合吧?
比如这个
module fixmultiply(product,a,b);
output [32:1] product;
input [32:1] a,b;
reg [32:1] product;
reg [64:1] temp;
reg [32:1] aa,bb;
reg a1,b1,c1; //???
reg [64:1] cc; //??
always @(a,b)
begin
a1=a[32];
b1=b[32];
aa=(a1==0)?a:{~a[31:1]+1'b1};
bb=(b1==0)?b:{~b[31:1]+1'b1};
c1=a1^b1;
cc=aa*bb; //31 bits times 31 bits
if (c1==0)temp=cc;
else temp=~{1'b0,cc}+1'b1;
product=temp[48:17];
end
endmodule
基本上是用阻塞赋值语句实现的matlab(真想给自己一巴掌--!), 请问有办法把这个补码乘法器,改成可综合的代码吗?
module fixmultiply(product,a,b,clk);
output [32:1] product;
input [32:1] a,b;
input clk;
wire clk;
reg [32:1] product;
reg [64:1] temp;
reg [32:1] aa,bb;
reg a1,b1,c1; //???
reg [64:1] cc; //??
always @(posedge clk)
begin
a1<=a[32];
b1<=b[32];
aa<=(a1==0)?a:{~a[31:1]+1'b1};
bb<=(b1==0)?b:{~b[31:1]+1'b1};
c1<=a1^b1;
cc<=aa*bb; //31 bits times 31 bits
if (c1==0)temp<=cc;
else temp<=~{1'b0,cc}+1'b1;
product<=temp[48:17];
end
endmodule
这样可以综合了吗? |
|