我想知道是否允许这种语法
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的输入而改变。 然而,问题更多的是一个关于“总是在一个总是在一块内是否合法”的问题
答案 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节。