这里有verilog代码:
module test;
reg wr, rd;
reg clk, en;
integer count=1;
initial begin
clk = 0;
forever #5 clk=~clk;
en = 0;
#5 en = 1;
forever #10 en=~en;
end
always @(posedge clk && posedge en) begin //<-- Error here
if(count %2 == 1) begin
wr=1;
$display("writing");
end
else begin
rd=1;
$display("reading");
end
end
endmodule
该程序在第14行显示错误。当“clk”和“en”都发出高电平时,我想执行“always block”。但它不起作用。
任何建议。
答案 0 :(得分:1)
您使用的语法非常接近法律语法,但不符合您的意图!
将&&
替换为or
:
always @(posedge clk or posedge en)
这将触发clk并触发en,这会使en
成为异步信号。在数字设计中应该非常小心地处理异步信号。
正如@nio建议你真正要做的是在clk上触发,然后检查启用是否很高。
always @(posedge clk) begin
if (en == 1'b1) begin
..
end
end
只要没有else
子句,这是一个好处,这是合成工具使用自动时钟门插入的很好的语法。
答案 1 :(得分:0)
如果您只检测clk的正边沿并测试块内的en = 1会怎么样?这是一种正常的方法......你应该有一个主时钟并测试一个块内的其他信号
always @(posedge clk)
begin
if (en==1'b1)
begin
if(count %2 == 1)
begin
wr=1;
$display("writing");
end
else
begin
rd=1;
$display("reading");
end
end
end