日常记录(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!