在做一份工作之前等待poskge clk? - 怎么样

时间:2011-05-02 05:53:47

标签: verilog hdl system-verilog

module DoorControl( clk, data, open,addressOftheMemory,  outp );

localparam Size_ofTheWord = 32;
input open;

input [16:0] addressOftheMemory;
input [Size_ofTheWord-1:0] data;

input clk ;
output reg outp;
reg [WordSize-1: 0] Memory [65535: 0];


always @ ( open )  // open is 1 or 0 
  if ( open  )          
     // i
     outp = Memory[addressOftheMemory];
  else if ( !open )    
     Memory[addressOftheMemory] = data;


endmodule

标有(i)的行,我想在将outp发送到输出端口之前等待posedge clk。但是,当我尝试过时;

if ( posedge clk )

它给出了错误

while ( clk != 1 ) begin

end 

它给出了absurb答案/模拟输出。 在发送输出之前,我应该在该行等待posedge clk做什么?

2 个答案:

答案 0 :(得分:3)

你必须更加批判性地思考你想要建模的东西。看起来你只是试图用“打开”来控制读/写操作来建模内存。

你有异步写入数据&同步读取数据。对于内存访问,最好只具有完整的同步行为。

always @(posedge clk) begin
if( open )
    outp = Memory[addressOftheMemory];
else
    Memory[addressOftheMemory] = data;
end

答案 1 :(得分:1)

您可以将执行延迟到时钟边缘,如下所示:

always @ ( open )  // open is 1 or 0 
  if ( open  )
     @(posedge clk) outp = Memory[addressOftheMemory];
  else if ( !open )    
     Memory[addressOftheMemory] = data;

可能会或可能不会达到您想要的效果。它不可合成,并且always块在执行或暂停时不会被重新安排,所以如果open在一个时钟周期内多次切换,那么该代码可能不会按照您的要求执行

更多背景信息:您可以在任何语句上指定延迟/事件控制,包括空语句。 (例如,在@(posedge clk);中,分号是一个空语句。)实际上,always结构的语法定义是:

  

always_construct:始终声明

意味着always @(open)always @(posedge clk)没有什么神奇之处,它们只是简单地引入一个语句并指定事件控制。当延迟控制(#)附加到语句时,语句的执行将推迟到将来的固定时间。当事件控制(@)附加到语句时,语句的执行将延迟到满足事件条件。