系统verilog始终在始终内

系统verilog始终在始终内,verilog,system-verilog,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_PERIO

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

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的输入而改变。
然而,问题更多的是关于“始终在始终块中的始终是否合法”的问题。

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

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
变量/寄存器/连线,则可以使用
永久
循环构造,而不是内部
始终
块。Dave_59的回答中更清楚地显示了示例用法


有关生成程序块的更多信息,请参阅第27.5节。

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

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
变量/寄存器/连线,则可以使用
永久
循环构造,而不是内部
始终
块。Dave_59的回答中更清楚地显示了示例用法


有关
生成
块的更多信息,请参阅第27.5节。

永久循环解决方案不起作用,因为顶级
始终
块无法退出
永久
循环并转到case语句的另一个分支。一个更简单的解决方案是使用一个always块来计算时钟延迟,另一个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;

永久循环解决方案不起作用,因为顶级
始终
块无法退出
永久
循环并转到case语句的另一个分支。一个更简单的解决方案是使用一个always块来计算时钟延迟,另一个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;

请添加和解释您正在尝试执行的操作。请添加和解释您正在尝试执行的操作。aaa在此测试台中被视为“逻辑”,因此它是一个可以在运行时更改其值的变量(而不是elab时间常数)。因此,您应该使用第二个选项
永久
循环。顺便说一句,您不能将
始终_comb
与具有延迟或不代表组合逻辑的代码一起使用哦!我差点忘了。谢谢你的指点。我只是想强调一点,它可以使用
永远
循环来完成。aaa在这个测试台中被视为一个“逻辑”,所以它是一个可以在运行时更改其值的变量(而不是elab时间常数)。因此,您应该使用第二个选项
永久
循环。顺便说一句,您不能将
始终_comb
与具有延迟或不代表组合逻辑的代码一起使用哦!我差点忘了。谢谢你的指点。我只是想强调一点,它可以使用
永久
循环来完成。