在Verilog测试平台中,我试图编写以下行为:
等到事件发生(上升/下降沿)最长时间,即等效的VHDL指令:
wait until <event> for <duration>;
Run Code Online (Sandbox Code Playgroud)具有以下行为(提醒):
除非我弄错了,我在Verilog中找不到任何直接等效的函数...所以我尝试了以下代码:
reg watchdog;
// ...
// Set a signal 'watchdog' in background which will be triggered in 10 us.
fork
watchdog <= #10_000 1'b1;
join
// Wait until SIGNAL is set to '1' *OR* watchdog event occurs.
@(posedge SIGNAL or posedge watchdog);
// Reset the watchdog
watchdog <= 1'b0;
Run Code Online (Sandbox Code Playgroud)
此代码完成工作,但最后一条指令不取消或取代fork指令.因此,在第二次调用此代码时(例如watchdog <= #50_000 1'b1;),watchdog可能会触发第一次(很快就会发生).
有什么好主意吗?(取消第一次计划的等效或方式fork?)
PS:在SystemVerilog中这样做不是一个选项... ;-)
我正试图用C语言中的Linux MTD驱动程序擦除NOR闪存......
我对来自ioctl(MEMUNLOCK)调用的返回状态感到困惑,即使ioctl(MEMERASE)在它之后成功也会返回错误.
以下代码显示警告消息但有效(即Flash块已被删除):
int erase_MTD_Pages(int fd, size_t size, off_t offset)
{
mtd_info_t mtd_info;
erase_info_t ei;
ioctl(fd, MEMGETINFO, &mtd_info);
ei.length = mtd_info.erasesize;
for(ei.start = offset; ei.start < (offset+size); ei.start += mtd_info.erasesize) {
if(ioctl(fd, MEMUNLOCK, &ei) < 0)
{
// logPrintf(FAILURE, "[Flash] Can not unlock MTD (MEMUNLOCK, errno=%d)!\n", errno);
// return RETURN_FILE_ERROR;
logPrintf(WARNING, "[Flash] Can not unlock MTD (MEMUNLOCK, errno=%d)!\n", errno);
}
if(ioctl(fd, MEMERASE, &ei) < 0)
{
logPrintf(FAILURE, "[Flash] Can not erase MTD (MEMERASE, errno=%d)!\n", errno); …Run Code Online (Sandbox Code Playgroud)