写入时钟块之前的 SystemVerilog 计算
SystemVerilog calculations right before writing to clocking block
我有一个任务,它的工作是通过时钟块将数据驱动到总线上。请参阅代码段:
task effects_driver::ReadQueueData();
stream_intf_.cycles(); // clocking block event
if (sample_q_.size() >= 2) // check to see if there is enough data in the queue
begin
automatic bit [31:0] sample0, sample1;
sample0 = sample_q_.pop_front(); // read from queue
sample1 = sample_q_.pop_front(); // read from queue
stream_intf_.cb.AXIS_TDATA <= {sample1, sample0}; // drive two samples at once
stream_intf_.cb.AXIS_TVALID <= 1;
end
else
...
endtask
您会注意到,在将队列写入时钟块之前,我需要从队列中读取几个项目。这是正确的方法吗?我能保证模拟器会在将自动变量写入时钟块之前对其执行这些阻塞赋值吗?
谢谢!
P.S。我 运行 半频繁地进入这个场景——我需要在写入时钟块之前即时进行一些快速计算。
我相信你是想问“我能保证模拟器会在将自动变量写入时钟块之前对其执行这些阻塞赋值吗?”因为这就是您的代码正在做的事情。
答案是肯定的,阻塞赋值保证在执行它后面的语句之前完成。
另请注意,无需声明具有自动生命周期的 sample0
和 sample1
,因为 class 方法始终具有自动生命周期。在其中声明的变量是隐式自动的。
我有一个任务,它的工作是通过时钟块将数据驱动到总线上。请参阅代码段:
task effects_driver::ReadQueueData();
stream_intf_.cycles(); // clocking block event
if (sample_q_.size() >= 2) // check to see if there is enough data in the queue
begin
automatic bit [31:0] sample0, sample1;
sample0 = sample_q_.pop_front(); // read from queue
sample1 = sample_q_.pop_front(); // read from queue
stream_intf_.cb.AXIS_TDATA <= {sample1, sample0}; // drive two samples at once
stream_intf_.cb.AXIS_TVALID <= 1;
end
else
...
endtask
您会注意到,在将队列写入时钟块之前,我需要从队列中读取几个项目。这是正确的方法吗?我能保证模拟器会在将自动变量写入时钟块之前对其执行这些阻塞赋值吗?
谢谢!
P.S。我 运行 半频繁地进入这个场景——我需要在写入时钟块之前即时进行一些快速计算。
我相信你是想问“我能保证模拟器会在将自动变量写入时钟块之前对其执行这些阻塞赋值吗?”因为这就是您的代码正在做的事情。
答案是肯定的,阻塞赋值保证在执行它后面的语句之前完成。
另请注意,无需声明具有自动生命周期的 sample0
和 sample1
,因为 class 方法始终具有自动生命周期。在其中声明的变量是隐式自动的。