系统verilog总是在内

时间:2016-11-14 09:34:12

标签: verilog system-verilog

我想知道是否允许这种语法

always_comb begin
    case (aaa)
    3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ :
    3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ
    3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ
    3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ
    3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ

    default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ   
            endcase 

我总是在案例中遇到有关嵌套的编译错误。 我试图让时钟频率根据aaa的输入而改变。 然而,问题更多的是一个关于“总是在一个总是在一块内是否合法”的问题

2 个答案:

答案 0 :(得分:2)

永久循环解决方案不起作用,因为顶级always块无法退出forever循环并进入case语句的另一个分支。一个更简单的解决方案是使用always块来计算时钟延迟,另一个总是阻塞来创建时钟。

int clk_delay;
always_comb
    case (aaa)
    3'b000: clk_delay = CLKREF_HALF_PERIOD + 5000ps; //000 at 80MHZ
    3'b001: clk_delay = 3750ps + CLKREF_HALF_PERIOD; //001 at 100MHZ
...
always #clk_delay xclk = ! xclk;

答案 1 :(得分:1)

不允许使用嵌套的程序块。我相信此处aaaaaa参数。如果是这样,您可以使用generate阻止。使用不同的时钟频率。这将使一个组合块一次处于活动状态。示例代码如下:

generate 
    case (aaaaaa)
    3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ :
    3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ
    3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ
    3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ
    3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ

    default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ 

endgenerate

如果aaa变量/ register / wire ,那么您可以使用forever循环结构而不是内部always块。在Dave_59的答案中更清楚地显示了样本用法。

有关generate块的更多信息,请参阅IEEE 1800-2012第27.5节。