研究状态更新

中了一篇Asia and South Pacific Design Automation Conference的文章,也是我PhD以来的第一篇regular paper。明年一月去台湾开会。hoho!

Advertisements

给我寄东西不要用DHL

我知道你们不会给我寄东西,我只是这么一说。万一呢,选邮政好了。

这源于最近让我很哭笑不得的一件事情。我搬家了。两周前从O2订了一个mobile broadband USB Modem,就是那种用手机上网的装置。这样我就能在整个大英帝国随时随地上网瞎溜达了。另外一个目的,就是测试一下这个新家的递送系统是否健全。

O2还是很好的,只要是网上订货都提供隔日递送。小件采用Royal Mail first class,大件是DHL。我订了DHL的隔日早上9:00到晚上9:00的服务。

第一天,在家等了一天,居然没收到。晚上回到实验室查DHL的跟踪系统,赫然显示DHL已在早上9:40分递送到一个名叫Reynolds的人手中。既然有人收了,那么咱们等等吧,反正咱也不着急。

第二天,仍然没有任何音讯。给O2写email。

第三天,O2按照承诺24小时内回复了email,告知我联系这个Reynolds。可是,我不认识他呀!好吧,我贴了一张大大的寻人启事在整栋楼的入口处。

第四天,没人响应。给O2打电话。O2的客服给DHL打电话,告知,该Reynolds是我住的大楼的house keeper。好的,我给物业打电话,居然被告知,查无此人!

第四天下午,给O2打电话,O2无奈,主动提供免费重新递送服务。(O2损失30GBP)我要求递送到实验室,婉拒,O2的系统只认home address!

第五天,仍然不见DHL。下午,DHL跟踪系统显示该递送被签收者拒绝。。。

第六天,DHL跟踪系统显示该货物被返回至Leeds的DHL中心。给O2打电话,O2系统还没有更新该退回信息。

之后我到Bristol开会两天。

第九天,给O2打电话,告知收到退回货物。O2答应返款,但是需要Fax信用卡付费纪录。当天下午到O2 Shop传真信用卡账单。

第十一天,今天,还没有收到返款。。。

————————–

总结一下,我在O2网上购了个东西,O2承诺隔日到达。但是最终的结果,该次交易失败,O2损失一个USB Modem,两次快递费用。DHL递送3次。顾客浪费两个工作日并加上无数个客服电话。

如果查找问题,顾客显然没有问题,已然竭尽可能去寻找被递送的货物(张贴了寻人启事,到附近大楼询问,询问物业公司和拨打楼中的一个住户的电话)。O2好像也没有问题,email回复及时,客服态度很好,提供免费重新递送和返款。DHL其实责任也不大,每一次递送都是按时的,将货物递送到楼管其实也是通常做法。但整个事件就像是那个两人吃大便增加国家GDP的故事一样,所有人忙了一圈,什么也没干。

不过DHL还是有责任的,为什么Royal mail能递到的东西DHL就不行。我的理解,这个Reynolds真的存在,但不是我们这栋楼的,那个家伙很笨,居然没看地址就把东西收了,直到第二次递送才发现DHL递错了东西。DHL之所以要这么干是因为他们有严格的时间限制。然而DHl很可笑的居然没有搞对地址。他们也很可气的就不给我打电话。

有时候,我们为了很快地做一件事情,却往往花费更多的时间。

BTW,我最终忍受不了了。几天前跑到市中心O2 Shop直接买了一个,花了一个半小时。

The “automatic” keyword in Verilog HDL and System Verilog

It may be quite odd to use the “automatic” variables in your Verilog HDL test benches or System Verilog codes. Somehow, it is better to know when you must use it. Recently I have encountered two strange problems and I would like to share the solutions here.

Every registers, wires and variables defined in Verilog are treated as global static variables in simulators. The keyword “automatic” will change this default attribute into stack value, which means changing a variable from a global static value into a value defined and stored in stack. This problem originates from the very beginning of Verilog, when Verilog is only taken as a hardware description language that there is no need to use stack. However, along with the increasing scale of hardware design, Verilog HDL is involved into hardware verification. Stack is important for the correctness of behavorial description and the keyword “automatic” is introduced for this purpose.

The first scenario where “automatic” has been used is to write a recursive function in Verilog. eg:
  function automatic integer mcal;
      input integer VCN;
      begin
     if (VCN <2)
       mcal = 0;
     else if(VCN == 2)
       mcal = 1;
     else if(VCN == 3)
       mcal = 3;
     else
       mcal = 2*(VCN/2) + mcal(VCN/2) + mcal(VCN/2+VCN[0]);
      end
   endfunction // mcal

Here mcal(i) = 2*(i/2)+mcal(i/2)+mcal(i-i/2). If the return value mcal is not a automatic value, only one copy of mcal exists in all code copies of mcal functions and the recursive algorithm would definitely fail.

The second scenario is more delicate and weird than the first one. eg:
   for(i=0; i<PE.size(); i++)
   begin
    automatic int j = i;
      fork
         PE[j].run();        // start a sub-thread
       join_none
   end

You may think the code “automatic int j = i;” is totally nonsense but it is the key to solve the problem. Without it, only one copy of i exists and the finally excuted thread would be PE[PE.size()].run(), which does not exist. (i == PE.size() when the for loop is finished and this is the time threads run() would run).

BTW, System Verilog is fantastic!

写得好!