集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 6063|回复: 11

verilog中@()语句的探索与讨论

[复制链接]
interige 发表于 2010-6-27 23:27:04 | 显示全部楼层 |阅读模式
在电路的设计中实时遇到这种情况 @(),我们通常遇到的是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下综合可综合

综合出来的的电路图与波形如下所示
UFO 发表于 2010-6-28 00:36:43 | 显示全部楼层
还真有点意思
FFT 发表于 2010-6-28 01:48:55 | 显示全部楼层
看不明白<br>
,请高手指点
ups 发表于 2010-6-28 02:36:02 | 显示全部楼层
其实就是一个简单的加法器,只是输出是在时钟的控制下而已,<br>
@() 是指满足括号中的内容的条件下只执行一次<br>
而前面加一个always 是指只要条件满足就一直执行
UFP 发表于 2010-6-28 03:40:39 | 显示全部楼层
这还可以综合??不可思议,没用过,最起码不是好的代码风格
UFP 发表于 2010-6-28 05:28:57 | 显示全部楼层
你说的很正确,我就是在知道@()什么意思的前提下,看看究竟在电路中能不能实现。这种设计不知在电路中是否常用到。一般在什么情况下用它。<br>
谢谢!
CCIE 发表于 2010-6-28 07:18:50 | 显示全部楼层
看了时序仿真图,感觉太奇怪了。时钟似乎不应在值变化时翻转。<br>
难道没有建立时间与保持时间吗?
CHA 发表于 2010-6-28 07:33:11 | 显示全部楼层
有意思,学习
CHANG 发表于 2010-6-28 07:40:26 | 显示全部楼层
以前没有见过这样写的,有何妙用呀???
ANG 发表于 2010-6-28 08:16:49 | 显示全部楼层
在好多的仿真文件中可能会见到这样的,在设计的可综合的文件中,截至现在我没有见过<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 [width-1:0] Data;<br>
reg [addr-1:0] WAddress, RAddress;<br>
reg Clock, WE, RE,rst;&nbsp;&nbsp;//addition rst<br>
reg [width-1:0] data_in [0:numvecs-1];<br>
reg [width-1:0] data_out [0:numvecs-1];<br>
wire [width-1:0] 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[0]=8'h00; data_out[0]=8'hxx;<br>
data_in[1]=8'h01; data_out[1]=8'hxx;<br>
data_in[2]=8'h02; data_out[2]=8'hxx;<br>
data_in[3]=8'h04; data_out[3]=8'hxx;<br>
data_in[4]=8'h08; data_out[4]=8'hxx;<br>
data_in[5]=8'h10; data_out[5]=8'hxx;<br>
data_in[6]=8'h20; data_out[6]=8'hxx;<br>
data_in[7]=8'h40; data_out[7]=8'hxx;<br>
data_in[8]=8'h80; data_out[8]=8'hxx;<br>
data_in[9]=8'h07; data_out[9]=8'h01;<br>
data_in[10]=8'h08; data_out[10]=8'h02;<br>
data_in[11]=8'h09; data_out[11]=8'h04;<br>
data_in[12]=8'h10; data_out[12]=8'h08;<br>
data_in[13]=8'h11; data_out[13]=8'h10;<br>
data_in[14]=8'h12; data_out[14]=8'h20;<br>
data_in[15]=8'h13; data_out[15]=8'h40;<br>
data_in[16]=8'h14; data_out[16]=8'h80;<br>
data_in[17]=8'haa; data_out[17]=8'h80;<br>
data_in[18]=8'h55; data_out[18]=8'haa;<br>
data_in[19]=8'haa; data_out[19]=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;&nbsp;&nbsp;//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 &lt;= width; k = k + 1)<br>
#1000 WAddress = k;<br>
WAddress = 0;<br>
end<br>
initial<br>
begin<br>
#9450;<br>
for (j = 0; j &lt;= 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 &lt;= numvecs-1; i = i + 1)<br>
begin<br>
@(negedge Clock);<br>
// apply test pattern at neg edge<br>
Data = data_in;<br>
@(posedge Clock)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br>
#450; //45 ns later<br>
// check result at posedge + 45 ns<br>
$display("attern#%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 &gt; 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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-19 16:39 , Processed in 0.063632 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表