日常记录(22)代码书写
代码书写
以下是一个乘法器实现(非设计,for循环不对),其中task的tmp指明了16位长度,用于存储移位后的结果。另外注意tmp需要为16位,否则存储结果会被截断。
如果直接q = q + p1<<i;则输出结果错误,需要括号q = q +( p1<<i);。
module mul ();
reg[15:0] q;
reg[7:0] p1, p2;
initial begin
mul_task(q, p1, p2);
# 10 p1=5;p2=6;
mul_task(q, p1, p2);
# 85 p1=5;p2=111;
mul_task(q, p1, p2);
# 10 p1=123;
mul_task(q, p1, p2);
# 10 $finish;
end
initial begin
$monitor("@%t, input p1 %d, p2 %d, output q %d", $time, p1, p2, q);
end
task automatic mul_task;
output reg[15:0] q;
input [7:0] p1, p2;
integer i;
reg [15:0] tmp;
begin
q=0;
for(i=0;i<8;i=i+1) begin
tmp=p1<<i;
if(p2[i]==1)
q = q + tmp;
end
# 10 q = q;
end
endtask
reg [7:0] tx;
initial begin
tx=8'b10110011;
# 10 tx=tx<<1;
# 5 tx=tx>>1;
end
initial begin
//$monitor("tx is %b", tx);
;
end
endmodule
结果:
@ 0, input p1 x, p2 x, output q x @ 10, input p1 x, p2 x, output q 0 @ 20, input p1 5, p2 6, output q 0 @ 30, input p1 5, p2 6, output q 30 @ 115, input p1 5, p2 111, output q 30 @ 125, input p1 5, p2 111, output q 555 @ 135, input p1 123, p2 111, output q 555 @ 145, input p1 123, p2 111, output q 13653 $finish called from file "mul.v", line 13. $finish at simulation time 155
<<和+的优先级
加法的优先级高于移位运算
https://blog.csdn.net/gsjthxy/article/details/108983326

例子:
module ssx ();
integer a=1;
integer b=1;
initial begin
int c = a + b <<1;
int d = a + (b <<1);
$display("value c %0d", c);
$display("value d %0d", d);
end
endmodule
输出:
value c 4 value d 3
模拟延时
延时分为上升,下降,关断延时。
每个部分分为:最小值:典型值:最大值
门级和数据流级的延时称为惯性延时,另外一种延时为传输延时,在行为级建模上定义。
惯性延时在小于建立保持时间的时候,输出就被覆盖掉。传输延时会延时一定时间在输出端。
`timescale 1ns/1ns
wire ans;
reg a, b;
initial begin
a=1; b=0;
#10
a=1; b=1;
#10
a=0; b=0;
#10
a=1; b=1;
#10
a=1; b=0;
#10
a=0; b=0;
#10
a=1'bx; b=0;
#10
a=1'bx; b=1'bx;
#10
a=1'bz; b=1'bz;
#100 $finish;
end
nand #(1:2:3, 3:5:6, 6) n1(ans, a, b);
initial begin
$monitor("@%0t input %b , %b, output %b",$realtime, a, b, ans);
end
endmodule
输出:
输入以后,输出值的变化会根据典型值的延时发生。
@0 input 1 , 0, output x @2 input 1 , 0, output 1 @10 input 1 , 1, output 1 @15 input 1 , 1, output 0 @20 input 0 , 0, output 0 @22 input 0 , 0, output 1 @30 input 1 , 1, output 1 @35 input 1 , 1, output 0 @40 input 1 , 0, output 0 @42 input 1 , 0, output 1 @50 input 0 , 0, output 1 @60 input x , 0, output 1 @70 input x , x, output 1 @72 input x , x, output x @80 input z , z, output x $finish called from file "delayt.v", line 31. $finish at simulation time 180
Le vent se lève! . . . il faut tenter de vivre!
Le vent se lève! . . . il faut tenter de vivre!

浙公网安备 33010602011771号