verilog中@()语句的探索与讨论
在电路的设计中实时遇到这种情况 @(),我们通常遇到的是always @()这种情况,为此我写了个测试代码,以讨论module a(clock,a,b,c);
input a,b,clock;
output c;
reg tmp;
always @(posedge clock)
begin
@(posedge a or posedge b)//注意这儿
tmp=a+b;
end
assign c=tmp;
endmodule
在quartus下综合可综合
综合出来的的电路图与波形如下所示 还真有点意思 看不明白<br>
,请高手指点 其实就是一个简单的加法器,只是输出是在时钟的控制下而已,<br>
@() 是指满足括号中的内容的条件下只执行一次<br>
而前面加一个always 是指只要条件满足就一直执行 这还可以综合??不可思议,没用过,最起码不是好的代码风格 你说的很正确,我就是在知道@()什么意思的前提下,看看究竟在电路中能不能实现。这种设计不知在电路中是否常用到。一般在什么情况下用它。<br>
谢谢! 看了时序仿真图,感觉太奇怪了。时钟似乎不应在值变化时翻转。<br>
难道没有建立时间与保持时间吗? 有意思,学习 以前没有见过这样写的,有何妙用呀??? 在好多的仿真文件中可能会见到这样的,在设计的可综合的文件中,截至现在我没有见过<br>
一下是一个双端口RAM的测试,来自Actel的官方文件中<br>
`timescale 1 ns/100 ps<br>
module test;<br>
parameter width = 8; // bus width<br>
parameter addr = 8; // # of addr lines<br>
parameter numvecs = 20; // actual number of vectors<br>
parameter Clockper = 1000; // 100ns period<br>
reg Data;<br>
reg WAddress, RAddress;<br>
reg Clock, WE, RE,rst; //addition rst<br>
reg data_in ;<br>
reg data_out ;<br>
wire Q;<br>
integer i, j, k, numerrors;<br>
ram u0(.data(Data), .q(Q), .clk(Clock),<br>
.rst(rst),<br>
.wen(WE),<br>
.ren(RE), .waddr(WAddress), .raddr(<br>
RAddress));<br>
initial<br>
begin<br>
// sequential test patterns entered at neg edge Clock<br>
data_in=8'h00; data_out=8'hxx;<br>
data_in=8'h01; data_out=8'hxx;<br>
data_in=8'h02; data_out=8'hxx;<br>
data_in=8'h04; data_out=8'hxx;<br>
data_in=8'h08; data_out=8'hxx;<br>
data_in=8'h10; data_out=8'hxx;<br>
data_in=8'h20; data_out=8'hxx;<br>
data_in=8'h40; data_out=8'hxx;<br>
data_in=8'h80; data_out=8'hxx;<br>
data_in=8'h07; data_out=8'h01;<br>
data_in=8'h08; data_out=8'h02;<br>
data_in=8'h09; data_out=8'h04;<br>
data_in=8'h10; data_out=8'h08;<br>
data_in=8'h11; data_out=8'h10;<br>
data_in=8'h12; data_out=8'h20;<br>
data_in=8'h13; data_out=8'h40;<br>
data_in=8'h14; data_out=8'h80;<br>
data_in=8'haa; data_out=8'h80;<br>
data_in=8'h55; data_out=8'haa;<br>
data_in=8'haa; data_out=8'h55;<br>
end<br>
initial<br>
begin<br>
rst=0;<br>
Clock = 0;<br>
WE = 0;<br>
RE = 0;<br>
WAddress = 0;<br>
RAddress = 0;<br>
Data = 0;<br>
numerrors = 0;<br>
#200 rst=1; //there rst reset to ram<br>
#200 rst=0;<br>
end<br>
always#(Clockper / 2) Clock = ~Clock;<br>
initial<br>
begin<br>
#2450 WE = 1;<br>
#8000 WE = 0;<br>
RE = 1;<br>
#8000 RE = 0;<br>
WE = 1;<br>
#1000 RE = 1;<br>
end<br>
initial<br>
begin<br>
#1450;<br>
for (k = 0; k <= width; k = k + 1)<br>
#1000 WAddress = k;<br>
WAddress = 0;<br>
end<br>
initial<br>
begin<br>
#9450;<br>
for (j = 0; j <= width; j = j + 1)<br>
#1000 RAddress = j;<br>
RAddress = 0;<br>
end<br>
initial<br>
begin<br>
$display("\nBeginning Simulation...");<br>
//skip first rising edge<br>
for (i = 0; i <= numvecs-1; i = i + 1)<br>
begin<br>
@(negedge Clock);<br>
// apply test pattern at neg edge<br>
Data = data_in;<br>
@(posedge Clock) <br>
#450; //45 ns later<br>
// check result at posedge + 45 ns<br>
$display("Pattern#%d time%d: WE=%b; Waddr=%h; RE=%b; Raddr=%h; Data=%h; Expected Q=%h;Actual Q=%h", i, $stime, WE, WAddress, RE, RAddress,Data, data_out, Q);<br>
if ( Q !== data_out )<br>
begin<br>
$display(" ** Error");<br>
numerrors = numerrors + 1;<br>
end<br>
end<br>
if (numerrors == 0)<br>
$display("Good! End of Good Simulation.");<br>
else<br>
if (numerrors > 1)<br>
$display(<br>
"%0d ERRORS! End of Faulty Simulation.",<br>
numerrors);<br>
else<br>
$display(<br>
"1 ERROR! End of Faulty Simulation.");<br>
#1000 $finish; // after 100 ns later<br>
end<br>
endmodule
页:
[1]
2